EBNF to BNF

4장 보조자료
• BNF
• BNF uses following notations:
• (i) Non-terminals : < >
• (ii) Rules X ::= Y
– (1) X : Nonterminal.
– (2) Y : a terminal, nonterminal, or concatenation of terminal
and nonterminals
– (3) metasymbol : ::=, |
• Example: <S>::= a < S > |a
• Notation ε : Used to represent an empty string
EBNF(Extended BNF)
• Additional Metasymbols
– [ ] for optional structures
– { } for repetitive structures
– ( ) for grouping
• Conversion from EBNF to BNF and
Vice Versa
• BNF to EBNF:
– (i) Look for recursion in grammar:
• A::= aA | a
• A::= a{a}
– (ii) Look for common string that can
be factored out with grouping and
options.
• A ::=aB |a
• A := a [B]
• EBNF to BNF:
– (i) Option: []
• A::= a[B]C
• A’::=aNC N::=B| ε
– (ii) Repetition: {}
• A ::=a{ B1B2... Bn}C
• A’::=aNC N::=B1B2...BnN| ε
<expr> ::= <digits>
<digits> ::= <digit>
| <digit><digits>
• <expr> ::= <digit>{<digit>}
<expr> ::= <digits>
<digits> ::= empty
| <digit><digits>
• <expr> ::= {<digit>}
<id> ::= <letter>
| <id><letter>
| <id><digit>
• <id> ::= <letter> {<letter> | <digit>}
Notes on use of EBNF
• Use {…} only for left recursive rules with associativity:
BNF : expr → expr + term | term
EBNF : expr → term {+ term }
• For right recursive rules use [ ... ] instead:
BNF :
expr => term + expr | term
EBNF :
expr => term [ + expr ]
=> left associativity
• Do not start a rule with {…}: write
expr → term {+ term }, not expr → {term +} term
– exception: left { x } is OK for simple token
expr => { - } term …
• Square brackets can be used anywhere, however:
expr → expr + term | term | - term
should be written as
expr → [-] term {+ term }
EBNF Examples
• Repetition
– BNF: expr → expr + term | term
– EBNF: expr → term { + term }
• Optional
if-stmt → if ( expr ) stmt
| if ( expr ) stmt else stmt
– EBNF: if-stmt → if ( expr ) stmt [ else
stmt ]
– BNF:
expr
=>
=>
=>
=>
expr + term
expr + term + term
expr + term + term + term
term + ... + term + term
BNF:
<expr> -> <expr> + <term>
| <expr> - <term>
| <term>
<term> -> <term> * <factor>
| <term> / <factor>
| <factor>
EBNF:
<expr> -> <term> {(+ | -) <term>}
<term> -> <factor> {(* | /) <factor>}
Syntax Diagram Examples
• Repetition
– EBNF: expr → term { + term }
expr
term
+
• Optional
– EBNF: if-stmt → if ( expr ) stmt [ else
stmt ] if-stmt
if
(
)
expr
stmt
else
stmt
모호성 제거 방법
• 해법1: 우선순위(precedence) 부여
–
–
–
–
+보다 *가 우선적으로 결합되도록
E ::= E + E | E -E | T (G2)
T ::= T * T | ( E ) | N
문법(G2)는 3 + 4 * 5에 대해서 모호성 해결
• 해법2: 결합순서(associativity) 부여
– E ::= E + T | E -T | T (G3)
– T ::= T * F | F
– F ::= ( E ) | N
• <expr> -> <expr> <op> <expr>
• <op> -> / | -
|
const