CFG
= { a, b, c } // 3개의 알파벳
N = { <S>, <A>} // 2개 논 터미널
P = { <S> -> a<A>c, <A>->a<A>, <A>->b, <A>-> }
S = <S>BNF
S ::= aAc
A ::= aA
| b
|
CFG
<EXP> -> (<EXP>+<EXP>)
<EXP> -> (<EXP>*<EXP>)
<EXP> -> <NUM>
<EXP> -> 1|42|17..BNF
<EXP> ::= ( <EXP> + <EXP> )
| ( <EXP> * <EXP> )
| <NUM>
<NUM> ::= 1, 42, 17 ...
<expr> ::= <expr> + <term> | <term>
<term> ::= <term> * <factor> | <factor>
<factor> ::= number | (<expr>)
expr은 term으로 term은 factor으로 factor은 expr 로..
- BNF와 EBNF의 차이는 EBNF는 대부분의 Recursive 스타일을 삭제한다는 것이다.
- {}와 []을 이용하여 반복을 표현한다.
- 즉, '재귀적 표현'을 '반복적 표현'으로 변경한다.
{ ... } = zero or more
{ .. = 0 ~ 7
[ .. ] = zero or one (optional)
<expr> 은 <term> 혹은 <term> + <term> 혹은 그 이상
<term> 은 <factor> 혹은 <factor>*<factor> 혹은 그 이상
EBNF에서는 여러 Operator들을 grouping하여 보다 문법을 간편하게 나타낼 수 있다.
EBNF는 Diagram으로 나타낼 수 있다.
Syntax Diagram은 문법을 좀 더 잘 이해하기 위해 다이어그램으로 나타낸 것이다.
Terminal : Circle
Non-terminal : Square
Sequence : Arrow
{}는 zero or more이므로, Non-terminal Loop에서 이와 같이 나타낼 수 있다.
[]는 zero or one 이기 때문
첫 번째 term은 무조건 오고, 그 뒤에 term이 추가적으로 올 수도/ 아닐수도 있으므로
parser은 우리가 준 CFG를 이용하여 해당 문자열s가 적합한지 확인한다.
CFG 문법으로, 주어진 문자열 s가 우리의 언어에 적합한지 "production rule을 역순으로 적용하여" 확인할 수 있다.
이러한 문법에서, 아래 세 가지 string은 올바른 문법인가?!