背景:
Yacc,JavaCup等工具都是基于BNF(類似于BNF的形式),
EBNF 需要轉(zhuǎn)化為 BNF,
或者說是轉(zhuǎn)化為適用于JavaCup的語法形式.
說明:
EBNF 和 BNF的主要區(qū)別:
1. {} 重復(fù),0至n 次
2. [] 可選,0或1次
規(guī)則:
1.形如:
S = { A } ;
轉(zhuǎn)化為:
S = A' ;
A' = A A' | ;
2. 形如:
S = [ A ] ;
轉(zhuǎn)化為:
S = A' ;
A' = A | ;
3. 形如:
S = ( A ) ;
轉(zhuǎn)化為:
S = A' ;
A' = A ;
實(shí)例:
已知某程序語言的EBNF片斷,如下:
declarations = ["CONST" {identifier "=" expression ";"}]
["TYPE" {identifier "=" type ";"}]
["VAR" {identifier_list ":" type ";"}]
{procedure_declaration ";"} ;
首先看到有3對[],4對{}.
引入7個新的非終結(jié)符:
OPTION_1,OPTION_2,OPTION_3,
REPEAT_1,REPEAT_2,REPEAT_3,REPEAT_4.
根據(jù)規(guī)則:
1.
首先有:
declarations = OPTION_1 OPTION_2 OPTION_3 REPEAT_1 ;
2.
接著定義新的產(chǎn)生式:
OPTION_1 = "CONST" REPEAT_2 | ;
OPTION_2 = "TYPE" REPEAT_3 | ;
OPTION_3 = "VAR" REPEAT_4 | ;
REPEAT_1 = procedure_declaration ";" | REPEAT_1;
若以上產(chǎn)生式右部存在沒有定義的非終結(jié)符,接著引入定義,否則,結(jié)束.
REPEAT_2 = identifier "=" expression ";" REPEAT_2 | ;
REPEAT_3 = identifier "=" type ";" REPEAT_3 | ;
REPEAT_4 = identifier_list ":" type ";" REPEAT_4 | ;
所有非終結(jié)符已定義,結(jié)束.