Parsing Bison/Yacc减少特定语法示例的冲突
我的编译器类有一个解析器项目。我无法解决其中一条规则的reduce/reduce冲突 此语法规则的图形表示在此链接中可用(很抱歉,由于stackoverflow策略,我无法在此发布图像): 其中所有椭圆都是端子符号 因为这个规则看起来有点复杂,我试着把它分解成更小的部分。 以下是我构建语法的尝试:Parsing Bison/Yacc减少特定语法示例的冲突,parsing,bison,yacc,context-free-grammar,reduce-reduce-conflict,Parsing,Bison,Yacc,Context Free Grammar,Reduce Reduce Conflict,我的编译器类有一个解析器项目。我无法解决其中一条规则的reduce/reduce冲突 此语法规则的图形表示在此链接中可用(很抱歉,由于stackoverflow策略,我无法在此发布图像): 其中所有椭圆都是端子符号 因为这个规则看起来有点复杂,我试着把它分解成更小的部分。 以下是我构建语法的尝试: type : id_or_int brackets_or_end ; id_or_int : IDnum | INTnum
type : id_or_int brackets_or_end
;
id_or_int : IDnum
| INTnum
;
brackets_or_end : brackets remainingpartboe
|
;
brackets : LBRACnum RBRACnum brackets
|
;
remainingpartboe: DOTnum type
|
;
请注意,端子是以后缀num结尾的单词,例如DOTnum。其余的是非终结符
Bison报告了以下冲突
mj-parser.y: conflicts: 1 reduce/reduce
mj-parser.y:122.18: warning: rule useless in parser due to conflicts:
brackets_or_end: /* empty */
请注意,上面的bison错误指的是括号或结束规则的第二个替代产品
请通过建议另一种书写语法的方法来帮助解决这一冲突。
顺便说一句,我已经查看了Bison的详细输出,但没有太大帮助
谢谢-sas(在评论中回答的问题。转换为社区wiki答案。请参阅)
@BobDalgleish写道:
请注意,在同一生产树中有两个非终结符可以为空。因此,空字符串可以缩减为括号或括号\u或\u结尾。这行不通 OP写道:
你完全正确,鲍勃。谢谢你的提示:括号不应该有一个ε减少。这将消除冲突,减少冲突
请注意,在同一生产树中有两个非终结符可以为空。因此,空字符串可以缩减为括号或括号\u或\u结尾。这行不通,你说得对,鲍勃。谢谢你的提示:括号不应该有一个ε减少。这将消除冲突,减少冲突。