0

我有一个用于编译器类的解析器项目。我无法解决其中一个规则的减少/减少冲突。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

+3

请注意,您有两个非终结符可以在同一生产树中为空。所以一个空字符串可以减少到括号或者括号或者结尾。这不起作用。 –

+0

你绝对是对的鲍勃。感谢提示:方括号不应该有一个减少epsilon。这将消除reduce-reduce冲突。 – user3416142

回答

0

(提问回答的意见转化为社区维基答案见Question with no answers, but issue solved in the comments (or extended in chat)

@BobDalgleish写道:

请注意,您有两个非终结点,可以在同一个生产树中是空的。所以一个空字符串可以减少到括号或者括号或者结尾。这不起作用。

的OP写道:

你是绝对正确的鲍勃。感谢提示:方括号不应该有一个减少epsilon。这将消除reduce-reduce冲突。