我是Bison的新手,我在转换/减少冲突方面遇到了麻烦......
我正在为C语言编写语法规则:ID是一个标识变量的标记,我编写了这个规则,以确保即使用括号写的标识符也可以考虑。
id : '(' ID ')' {printf("(ID) %s\n", $2);}
| ID {printf("ID %s\n", $1);}
;
Bison冲突的输出是:
State 82
12 id: '(' ID . ')'
13 | ID .
')' shift, and go to state 22
')' [reduce using rule 13 (id)]
$default reduce using rule 13 (id)
如何解决此冲突?
我希望我很清楚,谢谢你的帮助。
答案 0 :(得分:0)
您的id
规则本身不会导致转移/减少错误。您的语法中必须有一些使用ID
的其他规则。例如,您有一个表达式规则,例如:
expr: '(' expr ')'
| ID
;
在上面的示例中,ID
可以缩减为id
或expr
,并且解析器不知道要采取哪种缩减。检查状态22中的内容。
<小时/> 编辑:你问&#34; 我该怎么做才能解决冲突?&#34;
我正在编写C语言的语法规则:ID是一个标识变量的标记,我写了这个规则以确保标识符可以被考虑,即使它是用括号写的
作为左侧的括号中的变量在C中无效,因此它只能出现在右侧。然后,您可以将其视为表达式,因此只需删除您的规则以及使用id
的位置,将其替换为expr
。