gcc - yacc 中的 %left 和 %right

标签 gcc compiler-construction syntax if-statement yacc

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

相关文章:

gcc - 在具有 32 位用户空间的 64 位系统上,Configure 无法检测到正确的 ld

gcc - 无法接受正确的GNU编译器

c# - 编写一个极其简单的解析器

compiler-construction - 8086 汇编器 - 从操作码生成目标代码

python - 如何通过点符号访问数据

syntax - 在这种情况下,下划线是什么意思?

linux - 在 x86 上没有帧指针的堆栈展开

android - 将 gcc 命令转换为适用于 android ndk 的 CMake

C 编程基础知识 : Why can't I see the . o 使用 gcc 编译 .c 文件后的文件

c# - C#中global::keyword的用法是什么?