[英]Shift/Reduce conflict in Java Cup
我收到以下错误:
Warning : *** Shift/Reduce conflict found in state #2
between ExitLoopStatement ::= EXITLOOP (*)
and VarAccess ::= (*) DOLLAR IDENTIFIER
under symbol DOLLAR
这是我使用的语法。 当前,我有分配和中断(每个break语句可以指定要退出的循环级别数)。
start with StatementList;
StatementList
::= Statement
|
StatementList Statement
;
Statement
::= AssignmentStatement
|
ExitLoopStatement
;
AssignmentStatement
::= VarAccess EQ_OP VarAccess
;
VarAccess
::= DOLLAR IDENTIFIER
;
ExitLoopStatement
::= EXITLOOP
|
EXITLOOP VarAccess
;
据我了解,问题在于遇到EXITLOOP后,下一个标记可能是分配的开始或要退出的级别数。
有什么办法解决这个问题?
谢谢!
实际上,如果您的语言允许某个语句以可选的结尾(可能以另一条语句开头),并且该语言不需要在语句之间使用明确的标点符号,那么您将无法使用有限的超前解析器来解析该语句。
在这种极其简单的情况下,您可以使用LR(3)解析器解析语言,这意味着存在LR(1)语法(尽管它不太可读)。 但是,随着向该语言添加更多语法,您可能会发现所需的超前开始开始增加,甚至变得无限。 (例如,如果您实现数组并允许下标为任意表达式,则会发生这种情况。)
只要该语言实际上不是模棱两可,您仍然可以使用GLR解析器对其进行解析。 不幸的是,CUP不提供此选项,而且我不确定bison的Java框架是否也允许它。
总体而言,最简单的解决方案是坚持使用语句分隔符/终止符(如Java中的; )或删除可能与语句开头混淆的可选尾随语法。 例如,如果你改变exit $x
以exit ($x)
和不允许的语句开始与(那你会不会有冲突解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.