我们如何知道以下哪个逻辑操作(或,和,非)在波纹管上下文无关文法中具有更高的优先级?是否有解决此类问题的通用方法?
X → X 或 Y |是
Y → Y 和 Z | Z
Z → 不是 Z | (X) |真实|错误的
最佳答案
这是一个示例方法:
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 ')';
这些语法将操作符
*
和 /
定义为比 +
和 -
具有更高的优先级。您在解析树的更深处声明具有更高优先级的操作,因此解析器将首先尝试它们。
关于compiler-construction - 如何在上下文无关文法中判断运算符的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471876/