当前位置: 首页 > 面试题库 >

Java杯子中的Shift / Reduce冲突-悬空其他问题

范宏大
2023-03-14
问题内容

我收到以下错误:

Warning : *** Shift/Reduce conflict found in state #116
between Statement ::= Matched (*) 
and     Unmatched ::= IF LPAREN Condition RPAREN Matched (*) ELSE Unmatched 
and     Matched ::= IF LPAREN Condition RPAREN Matched (*) ELSE Matched 
under symbol ELSE
Resolved in favor of shifting.

现在,我知道了悬而未决的问题,并且我尝试使语法明确:

Statement ::= Matched | Unmatched ;


Matched ::= IF LPAREN Condition RPAREN Matched ELSE Matched
            |
            Others
             ;

Unmatched ::= IF  LPAREN Condition RPAREN Statement 
              | 
              IF  LPAREN Condition RPAREN Matched ELSE Unmatched
              ;

没有优先运算符,有什么方法可以解决此问题,还是语法有其他问题?


问题答案:

问题中显示的语法没有错,所以我的猜测是,移位/减少冲突是与另一种产品相互作用的结果。

将语句拆分为Matched和的想法Unmatched

Statement ::= Matched | Unmatched ;

正是为了确保else正确匹配最接近的unmatched if。一个Matched语句不能与其他条款进行扩展;
一种Unmatched说法本来是。因此,我们要求else语法中的标记不能跟随Unmatched语句,从而避免过早地减少可能已被else子句扩展的语句。

因此,在If语句内部,else只能遵循一条Matched语句。语句本身就是Unmatched如果它没有else子句,或者该else子句本身是Unmatched。因此,我们有三个产品:

Unmatched_If ::= IF LPAREN Condition RPAREN Statement
               | IF LPAREN Condition RPAREN Matched ELSE Unmatched ;
Matched_If   ::= IF LPAREN Condition RPAREN Matched ELSE Matched ;

但这还不是全部,因为还有其他可能的复合语句。例如考虑一个while声明。如果语言具有这样的构造,则语法可能包含以下内容:

While        ::= WHILE LPAREN Condition RPAREN Statement ; /* Wrong! */

那是行不通的,因为while语句也可以Unmatchedif...else语句可以完全相同:如果内部StatementUnmatched

例如,考虑

while (x) if (y) do_x_and_y;

由于While上面的生产不正确,可以将其减少如下:

   WHILE LPAREN Condition RPAREN Unmatched_If
-> WHILE LPAREN Condition RPAREN Statement
-> Matched

但这违反了Unmatched不能遵循的要求elseMatched可以紧随其后else,但在这种情况下以Matched结束Unmatched_If。因此,我们有一个转移/减少冲突:

if (w)
  while (x) if (y) do_this;
else do_that;

这可以解析为

IF ( Condition:[w] ) Matched:[while(x)if(y)do_this;] ELSE Statement:[do_that;]

但这实际上不是预期的解析。(缩进可能使我们认为这是程序员的意图,但这不是语言设计者的意图。)else应该与第二个if而不是第一个匹配,从而导致:

if (w)
  while (x)
    if (y) do_this; else do_that;

因此,我们需要区分匹配和不匹配的While语句,而不仅仅是匹配和不匹配的If语句:

Unmatched_While ::= WHILE LPAREN Condition RPAREN Unmatched ;
Matched_While   ::= WHILE LPAREN Condition RPAREN Matched ;

这样,while (x) if (y) do_x_and_y;将被解析为Unmatched_While,因此它不再是开始的制作的一部分IF LPAREN Condition RPAREN Matched ELSE...

当然,对于其他复合语句,例如语句,也需要执行相同的操作for

因此,最终结果将类似于:

Matched   ::= Matched_If
            | Matched_While
            | Matched_For
            | ...
            | Simple_Statement
            ;
Unmatched ::= Unmatched_If
            | Unmatched_While
            | Unmatched_For
            | ...
            ;


 类似资料:
  • 说明 这个 API 通常可以与其他所有包一起工作,然而,一些特殊的与 Laravel 融合很深,利用 Laravel 的路由提供某些功能的包,可能和 API 冲突。这一页列表其他的包与 API 冲突,以及一些必要的步骤使两个包正常工作。 目前还没有冲突的包.

  • 现在这种情况仍然发生,但很少发生,就像100次碰撞中有1次发生,而在100次碰撞中有20次发生之前

  • 在pom.xml文件中添加org.hibernate依赖项时出现问题 导致的错误列表和错误消息 [错误]2018-07-10 15:48:45.908[main]org.springframework.boot.springapplication.reportfailure(springapplication.java:842)-应用程序运行失败org.springframework.beans.

  • 所以我有一个使用Bootstrap的菜单系统,基本上是试图阻止下拉框项采用以下适用于

  • 我正在创建一个应用程序3x3 Tic tac toe,其中3x3是所有按钮,在点击监听器上,我正在检查可能的组合,是否两个玩家中的任何一个已经作出了他们的“O”或“X”。但在我的“if-else”部分,它不是检查条件,而是直接执行“if和else”部分,即使条件错误。我希望我的问题是可以理解和调试的。任何帮助都是值得的...

  • 问题内容: Java 使用方法在中插入K / V对。可以说我使用过method,现在有一个条目,其值为10和17。 如果我在其中插入10,20,由于键10相同而发生冲突,它会简单地用该条目替换之前的条目。 如果钥匙碰撞,则用新的K / V对替换旧的K / V对。 所以我的问题是何时使用Chaining冲突解决技术? 为什么它没有形成键值为10且值为17,20的a? 问题答案: 当您插入线对然后时,