2011-02-05 90 views
0

我有用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> 

我怎么能检查一个给定语法的正确性?任何想法?
谢谢,

回答

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>