0

我的编译器类有一个解析器项目。我无法解决其中一条规则的减少/减少冲突。

此语法规则的图形表示可在此链接中找到(抱歉,由于 stackoverflow 策略,我无法在此处发布图像):

“类型”语法规则的图形表示

所有椭圆都是终端符号。

由于这条规则看起来有点复杂,我试着把它分解成更小的部分。这是我构建语法的尝试:

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 */

请注意,上面的野牛错误是指第二个替代产生的括号_or_end 规则。

请通过建议另一种编写语法的方法来帮助解决此冲突。顺便说一句,我查看了 Bison 的详细输出,但没有太大帮助。

谢谢-sas

4

1 回答 1

0

(评论中回答的问题。转换为社区 wiki 答案。请参阅没有答案的问题,但问题在评论中已解决(或在聊天中扩展)

@BobDalgleish 写道:

请注意,您在同一生产树中有两个可以为空的非终结符。所以一个空字符串可以减少为括号或括号_or_end。这行不通。

OP写道:

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

于 2015-02-07T17:46:34.057 回答