我收到以下错误:
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
语句也可以Unmatched
与if...else
语句可以完全相同:如果内部Statement
为Unmatched
。
例如,考虑
while (x) if (y) do_x_and_y;
由于While
上面的生产不正确,可以将其减少如下:
WHILE LPAREN Condition RPAREN Unmatched_If
-> WHILE LPAREN Condition RPAREN Statement
-> Matched
但这违反了Unmatched
不能遵循的要求else
。Matched
可以紧随其后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? 问题答案: 当您插入线对然后时,