转移/减少Java Cup中的冲突
我得到以下错误:转移/减少Java Cup中的冲突,java,parsing,grammar,cup,Java,Parsing,Grammar,Cup,我得到以下错误: Warning : *** Shift/Reduce conflict found in state #2 between ExitLoopStatement ::= EXITLOOP (*) and VarAccess ::= (*) DOLLAR IDENTIFIER under symbol DOLLAR 这是我使用的语法。目前我有赋值和中断(每个中断语句可以指定要退出的循环级别的数量) 据我所知,问题是在遇到EXITLOOP之后,下一个标记可以
Warning : *** Shift/Reduce conflict found in state #2
between ExitLoopStatement ::= EXITLOOP (*)
and VarAccess ::= (*) DOLLAR IDENTIFIER
under symbol DOLLAR
这是我使用的语法。目前我有赋值和中断(每个中断语句可以指定要退出的循环级别的数量)
据我所知,问题是在遇到EXITLOOP之后,下一个标记可以是分配的开始或要退出的级别数
start with StatementList;
StatementList
::= Statement
|
StatementList Statement
;
Statement
::= AssignmentStatement
|
ExitLoopStatement
;
AssignmentStatement
::= VarAccess EQ_OP VarAccess
;
VarAccess
::= DOLLAR IDENTIFIER
;
ExitLoopStatement
::= EXITLOOP
|
EXITLOOP VarAccess
;
有没有办法解决这个问题
谢谢 实际上,如果您的语言允许一条语句有选择地以可能开始另一条语句的内容结尾,并且该语言不需要在语句之间使用明确的标点符号,那么您将无法使用有限的先行解析器对其进行解析 在这个非常简单的例子中,您可以使用LR(3)解析器解析您的语言,这意味着存在LR(1)语法(尽管它的可读性不高)。但是,当您向该语言添加更多语法时,您可能会发现所需的前瞻性开始增加,甚至变得无限。(例如,如果实现数组并允许下标为任意表达式,则会发生这种情况。) 只要该语言实际上不是模棱两可的,您仍然可以使用GLR解析器对其进行解析。不幸的是,CUP没有提供这个选项,我也不确定bison的Java框架是否允许它
总的来说,最简单的解决方案是坚持使用语句分隔符/终止符(如Java中的分隔符/终止符)或删除可能与语句开头混淆的可选尾部语法。例如,如果您将
exit$x
更改为exit$x
,并且不允许以语句开头(这样您就不会有解析冲突。添加语句分隔符解决了我的问题。谢谢!