11

我正在使用 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 冲突的信息,但对我而言,情况似乎并非如此。你能帮助我吗?

PS:IDENTIFIER、LPAREN "(" 和 RPAREN ")" 是终端,parlist 和 command 不是。

4

3 回答 3

9

你有两个产品:

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

当输入标记为 时,这是一个移位/减少冲突IDENTIFIER LPAREN,因为:

  • LPAREN可能是您尚未列出的新产品的开始,在这种情况下,解析器应将IDENTIFIER堆栈中的已经减少为command,并command LPAREN保留剩余的
  • 它们都可能是第二个生产的开始,所以它应该将LPAREN移到旁边的堆栈上IDENTIFIER并继续阅读,试图找到一个parlist.

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

command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;
于 2010-07-02T17:17:06.963 回答
9

您的问题根本不在这些规则中。尽管迈克尔·姆罗泽克的回答是解决“悬而未决的问题”的正确方法,但它并没有抓住手头的问题。

如果您查看错误消息,您会看到在对LPAREN 进行词法分析时存在移位/减少冲突。我很确定仅靠规则不会造成冲突。

我看不到你的语法,所以我帮不了你。但是您的冲突可能是当 acommand后跟以 a 开头的不同规则时LPAREN

查看任何其他可能在之后command并以 . 开头的规则LPAREN。然后,您将不得不巩固规则。对于特定输入,您的语法很有可能是错误的。

于 2010-07-22T13:16:18.440 回答
1

尝试设置优先级:

precedence left     LPAREN, RPARENT;

它迫使 CUP 决定冲突,采取左边的比赛。

于 2015-11-15T18:47:56.483 回答