Arj*_*K P 7 compiler-construction syntax gcc yacc if-statement
{%
#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 '!'
%%
Run Code Online (Sandbox Code Playgroud)
提到上面是yacc程序的一部分,用于简单的IF ELSE程序....我只是一个初学者而且不明白我们的意思%right和%left术语...... plz在这个场合帮助我......
Gus*_*gas 12
我知道这是一个老问题,但万一其他人正在寻找这些信息:
%left,%right并%nonassoc定义yacc如何解决运算符的重复.如果你有:
1 + 2 + 3
Run Code Online (Sandbox Code Playgroud)
两个运算符具有相同的优先级(它们是相同的:)),在这种情况下yacc可以解决:
// using %left
(1 + 2) + 3
Run Code Online (Sandbox Code Playgroud)
要么:
// using %right
1 + (2 + 3)
Run Code Online (Sandbox Code Playgroud)
最后:
//using %nonassoc
1 + 2 + 3 is considered illegal and a syntax error!
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读更多内容.
%left并%right指定操作员的关联性。一个操作的关联性确定首先执行相同优先级的两个操作中的哪一个。
假设我们有语法规则:
exp ::= exp + exp
exp ::= ID
Run Code Online (Sandbox Code Playgroud)
并假设我们必须解析表达式x + yz。您会看到,由于加号和减号的优先级相同,因此该表达式可以解释为(x + y)-z或x +(yz)。这似乎没什么大不了,但是它在语法中引入了歧义。
除了分析问题和理论外,假设我们正在分析表达式。6 + 5-7,并假设我们的语言只能使用自然数,并且在发生下溢时抛出异常。(6+5)-7(4)的结果将不等于6+(5-7)(exception),因此我们将无法预测结果-除非我们通过指定运算符的关联性来定义评估顺序。f()+g()+h()当操作数是可能具有副作用的函数时,还要考虑类似的表达式的情况。