Gcc %yacc中的左侧和%右侧 {% #包括 #包括 %} %令牌ID NUM IF THEN LE GE EQ NE OR ELSE %对“=” %左或右 %左“勒格均衡东北 %左'+''-' %左'*''/' %右耳门 %左‘!’ %%

Gcc %yacc中的左侧和%右侧 {% #包括 #包括 %} %令牌ID NUM IF THEN LE GE EQ NE OR ELSE %对“=” %左或右 %左“勒格均衡东北 %左'+''-' %左'*''/' %右耳门 %左‘!’ %%,gcc,compiler-construction,syntax,if-statement,yacc,Gcc,Compiler Construction,Syntax,If Statement,Yacc,上面提到的是yacc程序的一部分,用于简单的IF-ELSE程序。。。。 我只是一个初学者,不明白什么是%right和%left术语。。。。。。 请在这种情况下帮助我…%left和%right指定操作员的位置。一个操作的关联性决定了相同优先级的两个操作中的哪一个先执行 假设我们有语法规则: {% #include<stdio.h> #include<stdlib.h> %} %token ID NUM IF THEN LE GE EQ NE OR AND ELSE %r

上面提到的是yacc程序的一部分,用于简单的IF-ELSE程序。。。。 我只是一个初学者,不明白什么是
%right
%left
术语。。。。。。
请在这种情况下帮助我…

%left
%right
指定操作员的位置。一个操作的关联性决定了相同优先级的两个操作中的哪一个先执行

假设我们有语法规则:

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

%%
假设我们必须解析表达式x+y-z。你看,由于加号和减号的优先级相同,这个表达式可以解释为(x+y)-z或x+(y-z)。这似乎没什么大不了的,但它在语法中引入了歧义


撇开解析问题和理论不谈,假设我们正在解析表达式。6+5-7,假设我们的语言只能处理自然数,并且在发生下溢时抛出异常。
(6+5)-7
(4)的结果不等于
6+(5-7)
(例外),因此我们无法预测结果——除非我们通过指定运算符的关联性来定义求值顺序。当操作数是具有副作用的函数时,也要考虑诸如“代码> f+”+ g-(+)+ /()的表达式。

我知道这是一个老问题,但是如果有人在寻找这个信息:

%left
%right
%nonassoc
定义了yacc将如何解决运算符重复问题。如果您有:

exp ::= exp + exp
exp ::= ID
两个运算符具有相同的优先级(它们是相同的:),在这种情况下,yacc可以解决:

1 + 2 + 3
或:

最后:

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

您可以在中阅读更多。

还因为
%left'*''./'
写在
%left'+''''.-
下面,
*和/
的优先级高于
+和-
// using %right
1 + (2 + 3)
//using %nonassoc
1 + 2 + 3 is considered illegal and a syntax error!