2014-10-20 75 views

回答

4

下面是一个例子方法:

expr -> addExpr; 
addExpr -> multExpr (('+'|'-') multExpr)*; 
multExpr -> terminalExpr (('*'|'/') terminalExpr)*; 
terminalExpr -> integer | variable | '(' expr ')'; 

但相关性不明确。下面是BNF更明确的方式:

expr -> addExpr; 
addExpr -> addExpr '+' multExpr | addExpr '-' multExpr | multExpr; 
multExpr -> multExpr '*' terminalExpr | multExpr '/' terminalExpr | terminalExpr; 
terminalExpr -> integer | variable | '(' expr ')'; 

这些语法定义了运营商*/具有更优先为+-。您在解析树中更深入地声明操作的优先级更高,因此它们将首先被解析器尝试。

+1

很好的例子。谢谢。所以它意味着在解析树中优先级较高的操作应该较低。也许你可以添加到你的答案和ID加一个它! – 2014-10-20 18:08:04

+0

这个语法不会接受1 + 2 + 3 – rici 2016-10-21 23:50:31

+0

@rici呵呵我不知道我在想什么: - 谢谢注意这个,我已经解决了答案。 – 2016-10-22 10:09:02