我用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>
我如何检查给定语法的正确性?有什么想法?
谢谢,
答案 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>