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

问题描述:

我正在使用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和命令不是。

你的问题不是出在这些规则可言。尽管Michael Mrozek的回答是解决“悬而未决的问题”的正确方法,但它并没有把握手头的问题。

如果您查看错误消息,您会发现在LPAREN中存在移位/缩减冲突。我相当确信单单规则不会产生冲突。

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

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

+0

是的,你很棒。问题出在这一行上面。 4天前我解决了这个问题。我忘了更新这个问题。 – dierre 2010-07-22 17:58:29

你有两个作品:

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

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

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

你可以做这样的事情解决它:

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

谢谢,但即使使用此解决方案,我也有相同的转换/减少冲突。我没有语法错误,所以我很确定CUP不使用一些奇怪的“空符号”,但我正在检查它。 – dierre 2010-07-02 17:22:52

尝试设置优先级:

precedence left  LPAREN, RPARENT; 

它迫使银联决定的矛盾,采取左侧匹配。