Compiler construction 如何判断上下文无关语法中运算符的优先级

Compiler construction 如何判断上下文无关语法中运算符的优先级,compiler-construction,grammar,context-free-grammar,Compiler Construction,Grammar,Context Free Grammar,在下面的上下文无关语法中,我们如何知道以下哪些逻辑操作(或、和、否)具有更高的优先级?对于这类问题有没有一种通用的解决方法 X→ X或Y | Y Y→ Y和Z | Z Z→ 非Z |(X)|真|假以下是一个示例方法: expr -> addExpr; addExpr -> multExpr (('+'|'-') multExpr)*; multExpr -> terminalExpr (('*'|'/') terminalExpr)*; terminalExpr -> i

在下面的上下文无关语法中,我们如何知道以下哪些逻辑操作(或、和、否)具有更高的优先级?对于这类问题有没有一种通用的解决方法

X→ X或Y | 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 ')';

这些语法将运算符
*
/
定义为与
+
-
具有更高的优先级。您可以在解析树的深处以更高的优先级声明操作,因此解析器将首先尝试这些操作。

这是一个很好的示例。谢谢因此,它的意思是,具有较高优先级的操作在解析树中应该较低。也许你可以把它加到你的答案上,我再加一个@rici,嗯,我不知道我在想什么:-\n谢谢你注意到这一点,我已经找到了答案。谢谢。因此,如果我想向上述语法(具有最高优先级)添加一个指数(**)运算符,那么我需要在语法的最后二级添加此操作,对吗?@Prasanna因为指数运算的优先级高于乘法,所以需要向语法添加一个单独的级别(在
multExpr
terminalExpr
之间)以便正确处理它。@Lucastzesniewski,这对我帮助很大