我需要将以下语法转换为EBNF:
<assign> -> <id> = <expr>
<id> -> A|B|C
<expr> -> <expr> + <expr>
|<expr> * <expr>
|<expr> * <expr>
|( <expr> )
|<id>
我目前取得的进展如下:
<assign> -> <id> = <expr>
<id> = (A | B | C)
<expr> -> <id> {(+ | * ) <expr>} | ‘(‘ <expr> ‘)’
如果使用EBNF,最好是消除所有递归吗?是否有办法仅使用<id>
中的<expr>
来完成它?
答案 0 :(得分:3)
这个怎么样:
<assign> -> <id> = <expr>
<expr> -> <mul> {+ <mul>}
<mul> -> <term> {* <term>}
<term> -> ( <expr> ) | <id>
<id> -> A | B | C
没有左递归,*
优先于+
,但不超过( ... )
。