如何解决SHIFT / REDUCE冲突 - 在解析器生成器中

时间:2013-11-27 06:36:47

标签: parsing shift-reduce-conflict cup

我需要帮助来解决这个问题并解释如何在将来处理这种SHIFT / REDUCE冲突。

我的杯子文件中的几个州之间存在一些冲突。

Grammer看起来像这样:

我在“(”[ActPars]“)”状态“之间存在冲突。

1. Statement = Designator ("=" Expr | "++" | "‐‐" | "(" [ActPars] ")" ) ";"

2. Factor = number | charConst | Designator [ "(" [ActPars] ")" ].

我不想粘贴整个700行的杯子文件。 我会给你相关的状态和错误输出。

这是第1行的代码。)

Matched ::= Designator LPAREN ActParamsList RPAREN SEMI_COMMA

ActParamsList ::=  ActPars
               |
               /* EPS */
               ;

ActPars ::= Expr
        |
        Expr ActPComma
        ;

ActPComma ::= COMMA ActPars;    

这是第2行。)

Factor ::= Designator ActParamsOptional ;


ActParamsOptional ::= LPAREN ActParamsList2 RPAREN
              |
              /* EPS */
              ;

ActParamsList2 ::= ActPars
               |
               /* EPS */
               ;

Expr ::= SUBSTRACT Term RepOptionalExpression
         |
         Term RepOptionalExpression
         ;

ERROR输出如下所示:

Warning : *** Shift/Reduce conflict found in state #182
between ActParamsOptional ::= LPAREN ActParamsList RPAREN (*) 
and     Matched ::= Designator LPAREN ActParamsList RPAREN (*) SEMI_COMMA 
under symbol SEMI_COMMA
Resolved in favor of shifting.

错误: * 遇到比预期更多的冲突 - 解析器生成中止

1 个答案:

答案 0 :(得分:1)

我认为问题在于你的解析器不知道它是否应该转移到令牌:

SEMI_COMMA

或缩减为令牌

ActParamsOptional

因为ActParamsOptionalMatched中定义的令牌都是

LPAREN ActPars RPAREN