繁体   English   中英

Java Cup中的Shift / Reduce冲突

[英]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 $xexit ($x)和不允许的语句开始与那你会不会有冲突解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM