1
如何判断下列上下文自由文法中的下列逻辑操作中的哪一个(或者和非)具有较高的优先级?是否有这种问题的一般方法?如何判断上下文无关文法中操作符的优先级
X→X或Y | Y
Y→Y和Z | Z
Z→not Z | (X)| true |假
如何判断下列上下文自由文法中的下列逻辑操作中的哪一个(或者和非)具有较高的优先级?是否有这种问题的一般方法?如何判断上下文无关文法中操作符的优先级
X→X或Y | Y
Y→Y和Z | Z
Z→not Z | (X)| true |假
下面是一个例子方法:
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 ')';
这些语法定义了运营商*
和/
具有更优先为+
和-
。您在解析树中更深入地声明操作的优先级更高,因此它们将首先被解析器尝试。
很好的例子。谢谢。所以它意味着在解析树中优先级较高的操作应该较低。也许你可以添加到你的答案和ID加一个它! – 2014-10-20 18:08:04
这个语法不会接受1 + 2 + 3 – rici 2016-10-21 23:50:31
@rici呵呵我不知道我在想什么: - 谢谢注意这个,我已经解决了答案。 – 2016-10-22 10:09:02