如何解决转移/减少冲突?

时间:2010-07-02 17:11:49

标签: grammar lalr shift-reduce-conflict

我正在使用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

现在,我实际上希望它能够改变,所以我很好,但我的教授告诉我要找到解决冲突的方法。我瞎了。我总是读到if / else冲突但对我来说似乎并非如此。 你能救我吗?

P.S。:IDENTIFIER,LPAREN“(”和RPAREN“)”是终端,parlist和命令不是。

3 个答案:

答案 0 :(得分:7)

你的问题完全不在这些规则中。尽管Michael Mrozek的回答是解决“悬空的其他问题”的正确方法,但它并没有解决眼前的问题。

如果您查看错误消息,您会看到当lexing LPAREN 时出现转移/减少冲突。我很确定单凭规则不会造成冲突。

我看不懂你的语法,所以我无法帮助你。但是,您的冲突可能是command之后是以LPAREN开头的其他规则。

查看可能在command之后并以LPAREN开头的任何其他规则。然后,您必须合并规则。对于特定输入,您的语法很可能是错误的。

答案 1 :(得分:5)

你有两个作品:

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

当输入令牌为IDENTIFIER LPAREN时,这是一个转移/减少冲突,因为:

  • LPAREN可能是您未列出的新作品的开头,在这种情况下,解析器应将已经在堆栈上的IDENTIFIER缩减为command,并且command LPAREN 1}}剩下的
  • 它们都可能是第二次制作的开始,所以它应该将LPAREN移到IDENTIFIER旁边的堆栈上并继续阅读,试图找到parlist

您可以通过执行以下操作来解决此问题:

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

答案 2 :(得分:2)

尝试设置优先级:

precedence left     LPAREN, RPARENT;

它迫使CUP决定冲突,采取左对齐。