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

die*_*rre 8 grammar lalr shift-reduce-conflict

我正在使用CUP来创建我的论文所需的解析器.我的语法中有一个转移/减少冲突.我有这个制作规则:

command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN;
Run Code Online (Sandbox Code Playgroud)

我有这个警告:

Warning : *** Shift/Reduce conflict found in state #3
between command ::= IDENTIFIER (*) 
and     command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
under symbol LPAREN
Run Code Online (Sandbox Code Playgroud)

现在,我实际上是想让它转移,所以我很好,但我的教授告诉我找到解决冲突的方法.我瞎了.我总是读到if/else冲突但对我来说似乎并非如此.你能帮助我吗?

PS:IDENTIFIER,LPAREN"("和RPAREN")"是终端,parlist和命令不是.

rio*_*oki 7

你的问题根本不在那些规则中.尽管Michael Mrozek的回答是解决"悬空的其他问题"的正确方法,但它并没有解决眼前的问题.

如果查看错误消息,您会看到lexing LPAREN时出现 shift/reduce冲突.我很确定单凭规则不会产生冲突.

我看不到你的语法,所以我无法帮助你.但是你的冲突可能是当a command后面跟着一个以a开头的不同规则LPAREN.

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


Mic*_*zek 5

你有两个作品:

command ::= IDENTIFIER
command ::= IDENTIFIER LPAREN parlist RPAREN;
Run Code Online (Sandbox Code Playgroud)

输入令牌是移位/减少冲突IDENTIFIER LPAREN,因为:

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

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

command ::= IDENTIFIER command2
command2 ::= LPAREN parlist RPAREN |;
Run Code Online (Sandbox Code Playgroud)