代码之家  ›  专栏  ›  技术社区  ›  dierre

如何解决换班/减少冲突?

  •  6
  • dierre  · 技术社区  · 14 年前

    我用CUP创建了一个解析器,我的论文需要这个解析器。我的语法中有移位/减少冲突。我有这个生产规则:

    command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN;
    

    我有个警告:

    Warning : *** Shift/Reduce conflict found in state #3
    between command ::= IDENTIFIER (*) 
    and     command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
    under symbol LPAREN
    

    你能帮助我吗?

    3 回复  |  直到 7 年前
        1
  •  9
  •   rioki    14 年前

    你的问题根本不在那些规则里。尽管michaelmrozek的回答是解决“悬而未决的问题”的正确方法,但它并没有抓住眼前的问题。

    如果查看错误消息,就会发现存在shift/reduce冲突 . 我很肯定,单凭规则是不会造成冲突的。

    我看不懂你的语法,所以我帮不了你。但你的冲突可能是 command 后面是以 LPAREN

    看看有没有其他可能的规则 命令 . 你就得把规则合并起来。对于特定的输入,你的语法很有可能是错误的。

        2
  •  9
  •   Michael Mrozek    14 年前

    您有两部作品:

    command ::= IDENTIFIER
    command ::= IDENTIFIER LPAREN parlist RPAREN;
    

    IDENTIFIER LPAREN ,因为:

    • LPAREN 可能是尚未列出的新产品的开始,在这种情况下,解析器应该减少 IDENTIFIER command ,并且 command LPAREN 剩下的
    • 它们都可能是第二次生产的开始,所以它应该改变生产方式 LPAREN公司 在旁边的堆栈上 标识符 继续读下去,试着找到一个 parlist .

    您可以通过执行以下操作来修复它:

    command ::= IDENTIFIER command2
    command2 ::= LPAREN parlist RPAREN |;
    
        3
  •  2
  •   trunks0    9 年前

    尝试设置优先级:

    precedence left     LPAREN, RPARENT;
    

    推荐文章