【问题标题】:How to solve SHIFT/REDUCE conflict - in parser generator如何解决 SHIFT/REDUCE 冲突 - 在解析器生成器中
【发布时间】:2023-03-20 23:30:01
【问题描述】:

我需要帮助来解决这个问题并解释将来如何处理这种 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.

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

【问题讨论】:

  • 我认为ActParamsList2 有不平衡的括号。扩展 ActParamsOptional 的示例如下所示:(Expr))
  • 是的,你是对的——我已经改变了——那是错误的。随着新的班次减少出现,我已经改变了它并更新了错误输出。

标签: parsing shift-reduce-conflict cup


【解决方案1】:

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

SEMI_COMMA

或归约为token

ActParamsOptional

因为ActParamsOptionalMatched 中定义的标记都是

LPAREN ActPars RPAREN

【讨论】:

  • 解决方案是提供更多的前瞻性,或者将您的语法转换为明确的内容。例如,将其中一个标记的括号替换为方括号。
  • 谢谢您的回答-还有其他方法-我必须保留此语法-我必须保留括号“(”[ActPars]“)”-您可以看到它的外观就像在我的帖子开头(名为 1. 和 2. 的行)我不能使用优先关键字,因为他们告诉我们不要使用它:-(
  • @MilanBojovic 我试图通过它并查看语法,但我仍然对这些项目代表什么感到有点困惑。你能举几行例子来展示这种语言的样子吗?
  • 好的,我会给你第一行和第二行的例子: 1.) int i = 0; a = 10; b = 5; i = 添加(a,b);或者:int i = 0; i = functionWithoutActualParameters();
  • BTW 语言是 Micro Java。如果你遵循第一行 1.) Statement = Designator = Expr (Expression) 并且 Expression 最终可以引导我们进入第二行 2.) 示例:Expr = Factor = number |字符常量 |指示符 [ "(" [ActPars] ")" ]。也许这会导致问题 - 但我怎样才能改变这些冲突的行,以便 Parser 可以在它们之间产生差异?对不起,如果我有点困惑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2017-07-03
相关资源
最近更新 更多