这里冲突的例子是C编译器的一部分:移位/减少对C语言编译器
Exp :
INTNUMBER { $$ = $1; }
| lvalue { $$ = $1; }
| REALNUMBER { $$ = $1; }
| CHARVALUE { $$ = $1; }
| TRUE { $$ = $1; }
| FALSE { $$ = $1; }
| Exp '+' Exp { $$ = $1 + $3; }
| Exp '*' Exp { $$ = $1 * $3; }
| Exp '/' Exp { $$ = $1/$3; }
| Exp '-' Exp { $$ = $1 - $3; }
| Exp '%' Exp { $$ = $1 % $3; }
| Exp AND Exp { $$ = $1 && $3; }
| Exp OR Exp { $$ = $1 || $3; }
| Exp LEQ Exp { $$ = $1 <= $3; }
| Exp GEQ Exp { $$ = $1 >= $3; }
| Exp EQ Exp { $$ = $1 == $3; }
| Exp NEQ Exp { $$ = $1 != $3; }
| Exp GE Exp { $$ = $1 > $3; }
| Exp LE Exp { $$ = $1 < $3; }
| '-' Exp %prec UMINUS { $$ = -1 * $2; }
| STRING { $$ = $1; }
| '('Exp')' { $$ = $2; }
| lvalue '=' Exp { $1 = $3; }
| ID'('ExpList')' {printf("Exp");}
;
IDD :
ID { printf("IDD"); }
| IDD '[' Exp ']' {printf("IDD");}
;
ExpList
: { printf("ExpList"); }
ExpPlus {printf("ExpList");}
|
;
ExpPlus :
Exp { printf("Exp\n"); }
| Exp ',' ExpPlus {printf("ExpPlus");}
;
,其中,ID是一个终端(即,C中的ID可以与开始_或[A- 。ZA-Z] 在解析该代码使用-v标志野牛,我得到了一个转变/减少冲突如下:
52 IDD: ID .
78 Exp: ID . '(' ExpList ')'
'(' shift, and go to state 56
'(' [reduce using rule 52 (IDD)]
$default reduce using rule 52 (IDD)
我已经解决了所有的移进/归约,我遇到迄今冲突。但我无法理解这个问题应该如何解决。
谢谢
为了回答这个问题,您需要显示更多的语法。您所展示的摘录甚至没有指出在什么情况下可能会使用“IDD”;此外,冲突最有可能是使用“Exp”的环境的结果,这也是不可见的。 – rici