gpt4 book ai didi

gcc - yacc 中的 %left 和 %right

转载 作者:行者123 更新时间:2023-12-04 05:19:28 27 4
gpt4 key购买 nike

{%
#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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com