결합성과 EBNF

1 + 2 + 3 에서 어느 + 를 먼저 계산할까?

다시 모호해집니다

+ 의 양쪽이 다 풀립니다

이 규칙은 + 의 왼쪽도 <expr>, 오른쪽도 <expr>입니다. 그래서 1 + 2 + 3 을 앞의 둘부터 묶을 수도, 뒤의 둘부터 묶을 수도 있습니다. 나무가 둘이니 모호한 문법입니다.

이 강의가 따르는 교재의 문법입니다. const 자리에 예시 숫자 1, 2, 3을 넣었습니다.

고치는 법

오른쪽을 const로 막습니다

+ 의 오른쪽을 const로 바꾸면, 다시 풀 수 있는 것은 왼쪽의 <expr>뿐입니다. 나무는 왼쪽 아래로만 자라고, 모양이 하나로 정해집니다.

교재의 문법입니다. 나무의 잎에는 const 대신 예시 숫자를 적었습니다.

결합성

왼쪽부터 묶입니다

같은 연산자가 이어질 때 어느 쪽부터 묶이는지가 결합성(associativity)입니다. 앞 장의 규칙은 재귀가 + 의 왼쪽에 있어서 나무가 왼쪽 아래로 자랐고, 왼쪽 아래의 + 가 먼저 계산됩니다. 왼쪽 결합입니다.

더하기는 어느 쪽부터 해도 값이 같지만 빼기는 달라집니다. 빼기의 숫자는 예시입니다.

더 짧게 적기 ①

EBNF는 BNF에 괄호를 더했습니다

EBNF(확장 BNF)는 BNF에 기호 세 가지를 더해 짧게 적습니다. 둘을 먼저 보고, 셋째는 다음 장에서 봅니다. 대괄호 [ ] 는 있어도 되고 없어도 되는 부분, 소괄호 ( | ) 는 여럿 가운데 하나를 고르는 부분입니다.

proc_call은 함수 호출 같은 것, expr_list는 넘겨주는 식 목록입니다. 안쪽 ( )는 그대로 적는 괄호입니다.

더 짧게 적기 ②

중괄호는 0번 이상 되풀이

셋째 기호인 중괄호 { } 는 안의 것을 0번 이상 되풀이한다는 뜻입니다. 이 규칙은 “식별자는 글자 하나로 시작하고, 그 뒤에 글자나 숫자가 몇 개든 온다”고 읽습니다.

교재의 규칙입니다. letter는 글자 하나, digit는 숫자 하나입니다. 이름 셋은 예시입니다.

같은 문법, 다른 표기

여섯 줄이 두 줄로

BNF는 되풀이를 재귀로 적어 줄이 길어집니다. EBNF는 같은 되풀이를 { } 로 묶어 두 줄로 적습니다. 정하는 구문은 같고 적는 방식만 다릅니다.

교재의 문법입니다. * 는 곱하기이고, factor는 항을 이루는 더 작은 단위의 이름입니다. 문서에 따라 화살표 대신 콜론(:)을 쓰거나 opt, oneof 같은 말을 쓰기도 합니다.

다음 편

문법에 맞기만 하면 올바른 프로그램일까요?

7편문법에 맞는데 왜 틀렸을까? 2강 목록