关于BNF的问题

时间:2011-02-05 08:14:38

标签: programming-languages bnf

我用BNF写的这个语法。如何将其转换为+优先于*和强制+为右关联?

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

这是我的解决方案:

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

我如何检查给定语法的正确性?有什么想法?
谢谢,

1 个答案:

答案 0 :(得分:2)

看起来很奇怪你想要恢复乘法的优先级而不是加法,但无论如何你需要语法,那么正确的BNF就是(你在第三次制作时写错了)

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

适用于LR解析器(自下而上)。

对于LL解析器(自上而下),上述语法将导致<expr><term>上的左递归。 要解决此问题,您应该将此语法用于LL解析器:

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