我有一个用于编译器类的解析器项目。我无法解决其中一个规则的减少/减少冲突。Bison/Yacc为特定语法示例减少冲突
这个语法规则的图形表示可在此链接(抱歉我不能在这里张贴的图片,由于StackOverflow的策略):
Graphical representation of the "type" grammar rule
,所有的椭圆形是终端符号。
由于这条规则看起来有点复杂,我试图把它分解成更小的片断。 这是我尝试构建语法:
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。休息是非终点。
野牛报告下列冲突
mj-parser.y: conflicts: 1 reduce/reduce
mj-parser.y:122.18: warning: rule useless in parser due to conflicts:
brackets_or_end: /* empty */
注意,野牛错误上面提到的第二个替代生产的brackets_or_end规则。
请帮助解决此冲突建议另一种写法语法。顺便说一下,我已经看过Bison的详细输出,但它没有太大的帮助。
感谢-SAS
请注意,您有两个非终结符可以在同一生产树中为空。所以一个空字符串可以减少到括号或者括号或者结尾。这不起作用。 –
你绝对是对的鲍勃。感谢提示:方括号不应该有一个减少epsilon。这将消除reduce-reduce冲突。 – user3416142