首页 文章

Bison / Yacc减少了特定语法示例的冲突

提问于
浏览
0

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

此链接中提供了此语法规则的图形表示(抱歉,由于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 . 休息是非终结者 .

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错误指的是bracket_or_end规则的第二个替代 生产环境 .

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

谢谢--sas

1 回答

  • 0

    (问题在评论中回答 . 转换为社区维基答案 . 见Question with no answers, but issue solved in the comments (or extended in chat)

    @BobDalgleish写道:

    请注意,在同一 生产环境 树中有两个非终结符号可以为空 . 所以空字符串可以减少到括号或bracket_or_end . 这不行 .

    OP写道:

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

相关问题