%左右,并%的权YACC(%left and %right in yacc)

2019-08-01 11:02发布

{%
#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 '!'

%%

上面提到是一个简单的if else程序....我只是个初学者在YACC程序的一部分,不明白我们的意思%right ,并%left条款...... PLZ帮我在这场合...

Answer 1:

%left%right指定关联的运营商。 的操作的关联性确定哪个相同的优先级级别的两个操作被首先进行。

假设我们有语法规则:

exp ::= exp + exp
exp ::= ID

并假设我们要解析表达式x + YZ。 你看,如加的优先级水平和减是相同的,该表达式可以被解释为(X + Y)-Z或x +(YZ)。 这似乎不是什么大不了的,但它带来了模棱两可到语法。

解析问题和理论不谈,假设我们解析表达式。 6 + 5-7,并假设我们的语言只能用自然数工作,当出现下溢时抛出异常。 的结果(6+5)-7 (4)将不不等于6+(5-7)例外),所以我们将无法预测的结果-除非我们通过确定计算结果为顺序指定操作符的结合。 还考虑像表达式的情况下, f()+g()+h()当操作数都是可具有副作用的功能。



Answer 2:

我知道这是一个老问题,但在某些情况下,其他人正在寻找这样的信息:

%left%right%nonassoc ,定义YACC将如何解决运营商的重复。 如果您有:

1 + 2 + 3

无论是运营商具有相同的优先级(它们是相同的:)),在这种情况下的yacc可以解决:

// using %left
(1 + 2) + 3

要么:

// using %right
1 + (2 + 3)

最后:

//using %nonassoc
1 + 2 + 3 is considered illegal and a syntax error!

你可以阅读更多的在这里 。



文章来源: %left and %right in yacc