解析 - 导致移位/减少冲突的运算符

时间:2017-09-17 18:11:54

标签: c parsing compiler-construction bison

我想尝试编写一个基本的C解析器,但是我得到了许多移位/减少冲突。我从其他问题尝试了许多建议,但似乎没有任何效果。我尝试添加一些基于C语言的优先级,但我不断改变/减少冲突。我错过了什么?任何帮助将不胜感激!

野牛:

STUDENT_GRADES

报告的一部分:(几乎所有转移/减少冲突都来自我的代码的这一部分)

%union {char* var; char* type} 

%token <type> INT  DOUBLE BOOL CHAR
%token FOR WHILE 
%token IF ELSE PRINTF 
%token BYREF BREAK CONTINUE RETURN DELETE FALSE TRUE NEW NULL VOID
%token NUM 
%token INCLUDE
%token DOT
%token <var> ID 
%nonassoc ELSE
%right '[' ']'
%right    '!'  '-' '+' '?' ':'
%left AND OR 
%right  DELETE
%left  '&' '*'  '/' '%'
%left '<' '>' LE GE EQ NE LT GT
%right MUL_AS DIV_AS ADD_AS MIN_AS MOD_AS INCR DCRS 
%error-verbose


%%


 expr
   : ID
   | TRUE
   | FALSE
   | NULL
   |"(" expr ")"
   | ID "(" expr_list ")"
   | expr "[" expr "]"
   | expr '&' expr
   | expr '*' expr 
   | expr '!' expr
   | expr INCR
   | expr DCRS
   | expr '=' expr                %prec '='
   | expr DIV_AS expr            %prec MOD_AS
   | expr MOD_AS expr
   | expr MUL_AS expr
   | expr ADD_AS expr
   | expr MIN_AS expr
   | expr LE expr
   | expr GE expr
   | expr NE expr
   | expr EQ expr
   | expr GT expr
   | expr LT expr
   | "(" data_type ")" expr
   | expr "?" expr ":" expr
   | NEW data_type
   | NEW data_type "[" expr "]" 
   | DELETE expr

   ;

1 个答案:

答案 0 :(得分:2)

如果使用优先级声明来消除表达式解析的歧义:

  1. 您需要声明每个运算符。 (在您引用其转换的状态中,错误与 = 特别相关,其优先级尚未声明。)

  2. 您需要根据语法以正确的顺序列出优先关系。 (例如,&的绑定几乎与*一样紧。)此外,+-是关联的。

  3. 或者,您可以使用C标准中的C语法中的表达式语法作为基础。它是用明确的优先级编写的 - 即不需要优先级声明。在任何一种情况下,都值得花些时间来理解语法是如何工作的,既可以作为语言的描述,也可以驱动解析。优先级声明的工作原理是强制解析器将某些歧义解决为移位或缩减,因此它们在实践中与不使用优先级的明确语法非常相似。