{%
#include<stdio.h>
#include<stdlib.h>
%}
%token ID NUM IF THEN LE GE EQ NE OR AND ELSE
%right '='
%left AND OR
%left '<' '>' LE GE EQ NE
%left '+''-'
%left '*''/'
%right UMINUS
%left '!'
%%
上面提到的是 yacc 程序的一部分,用于一个简单的 如果其他 程序....
我只是一个初学者,不明白
%right
是什么意思|和 %left
条款……请在这种情况下帮助我...
最佳答案
%left
和 %right
指定 associativity一个运营商。操作的关联性决定了优先级相同的两个操作中的哪一个先执行。
假设我们有语法规则:
exp ::= exp + exp
exp ::= ID
并假设我们必须解析表达式 x+y-z。你看,由于加号和减号的优先级是一样的,这个表达式可以解释为(x+y)-z或x+(y-z)。这看起来没什么大不了的,但它在语法中引入了歧义。
撇开问题和理论不谈,假设我们正在解析表达式。 6+5-7,假设我们的语言只能处理自然数,下溢时抛出异常。
(6+5)-7
的结果(4) 不会不等于6+(5-7)
(异常(exception)),所以我们将无法预测结果——除非我们通过指定运算符的结合性来定义评估顺序。还要考虑像 f()+g()+h()
这样的表达式的情况, 当操作数是可能有副作用的函数时。
关于gcc - yacc 中的 %left 和 %right,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876543/