如何解决转变/减少冲突?
我正在使用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
开始。您将不得不巩固规则。对于特定的输入语法错误很有可能是错误的。
你有两个作品:
command ::= IDENTIFIER
command ::= IDENTIFIER LPAREN parlist RPAREN;
这是一个转变/减少冲突,当输入令牌IDENTIFIER LPAREN
,因为:
-
LPAREN
可能是一个新的开始生产你有没有列出,在这种情况下解析器应该将已经在堆栈中的IDENTIFIER
减少为command
,并且还有command LPAREN
剩余的 - 它们可能都是第二次生产的开始,所以它应该将
LPAREN
转移到IDENTIFIER
旁边的堆栈上并继续阅读,试图找到parlist
。
你可以做这样的事情解决它:
command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;
谢谢,但即使使用此解决方案,我也有相同的转换/减少冲突。我没有语法错误,所以我很确定CUP不使用一些奇怪的“空符号”,但我正在检查它。 – dierre 2010-07-02 17:22:52
尝试设置优先级:
precedence left LPAREN, RPARENT;
它迫使银联决定的矛盾,采取左侧匹配。
是的,你很棒。问题出在这一行上面。 4天前我解决了这个问题。我忘了更新这个问题。 – dierre 2010-07-22 17:58:29