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
;
答案 0 :(得分:2)
如果使用优先级声明来消除表达式解析的歧义:
您需要声明每个运算符。 (在您引用其转换的状态中,错误与 = 特别相关,其优先级尚未声明。)
您需要根据语法以正确的顺序列出优先关系。 (例如,&
的绑定几乎与*
一样紧。)此外,+
和-
是关联的。
或者,您可以使用C标准中的C语法中的表达式语法作为基础。它是用明确的优先级编写的 - 即不需要优先级声明。在任何一种情况下,都值得花些时间来理解语法是如何工作的,既可以作为语言的描述,也可以驱动解析。优先级声明的工作原理是强制解析器将某些歧义解决为移位或缩减,因此它们在实践中与不使用优先级的明确语法非常相似。