728x90

 BNF를 확장시킨 것이 EBNF이다. Extended BNF 그래서 EBNF다. 일반적으로 3가지 확장 사항이 포함된다.

1. 선택: '[', ']'로 표현한다.
예시: <if_stmt> ::= if( <exp> ) <stmt> [ else <stmt> ]
위 예제를 보고 else 부분이 선택되지 않는 경우 if( <exp> ) <stmt> 란 것을 우린 알 수 있다.

2. 반복: '{', '}'으로 표시하고, 무한정 반복되거나 생략될 수 있음을 나타낸다. 선택이란 다른 점이 별로 없어보이지만, 선택은 반복이 아닌란 것을 명심하자.
예시: <ident_list> ::= <ident> { , <ident> }
위 예시를 지금은 이해가 되지 않을 수 있지만, 조금 있다 볼 예제를 보고 알 수 있다.

3. 다중 선택: '(', ')'로 표시하고 OR란 것을 알 수 있다. 소괄호로 표현하기 때문에 어휘항목인 터미널이랑 혼동될 수 있으니 조심해야한다.
예시: <term> ::= <term> ( * | / | % ) <facotr>

BNF를 EBNF으로 바꾸거나, EBNF를 BNF로 바꾸거나 한다. 먼저 BNF를 EBNF로 바꿔보자.

BNF
<expr> ::= <expr> + <term> | <expr> - <term> | <term>
<term> ::= <term> * <factor> | <term> / <factor> | <factor>
<factor> ::= <exp> ** <factor> | <exp>
<exp> ::= ( <expr> ) | <id>

EBNF
<expr> ::= <term>{ ( + | - ) <term> }
<term> ::= <factor> { ( * | / ) <facotr> }
<factor> ::= <exp> { ** <exp> }
<exp> ::= ( <expr> ) | <id>

이후 글에서 더 많은 예제를 살펴보자!

반응형

+ Recent posts