我正在使用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和命令不是。
答案 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决定冲突,采取左对齐。