将BNF转换为EBNF - 没有递归的括号?

时间:2011-09-14 20:02:53

标签: bnf ebnf

我需要将以下语法转换为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>来完成它?

1 个答案:

答案 0 :(得分:3)

这个怎么样:

<assign> -> <id> = <expr>
<expr>   -> <mul>  {+ <mul>}
<mul>    -> <term> {* <term>}
<term>   -> ( <expr> ) | <id>
<id>     -> A | B | C

没有左递归,*优先于+,但不超过( ... )