4

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

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

语法看起来像这样:

我在“(”[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
         ;

错误输出如下所示:

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.

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

4

1 回答 1

1

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

SEMI_COMMA

或减少为令牌

ActParamsOptional

因为在ActParamsOptional和中定义的标记Matched

LPAREN ActPars RPAREN
于 2013-11-27T22:23:38.530 回答