我在yacc中使用了-v选项来生成y.output文件。在文件的顶部,它说
国家98冲突:1班/减少
文件中的下面是以下内容:
state 98
30 selection_stmt: IF '(' expression ')' statement .
31 | IF '(' expression ')' statement . ELSE statement
ELSE shift, and go to state 101
ELSE [reduce using rule 30 (selection_stmt)]
$default reduce using rule 30 (selection_stmt)
冲突是什么,以及如何解决?
答案 0 :(得分:1)
使用if/then/else
语句错误地每次转移/减少错误都是臭名昭着的dangling else问题。
使用此代码段:
if (f1):
if (f2):
c1
else:
c2
你(以及Python由于其奇怪的缩进规则)知道if
else
属于哪个,但解析器并不那么聪明。
无法判断else
是属于第一个还是第二个if
。
This link显示了如何将LR(n)转换为应该解决问题的LR(1)等价物。
另一种方法是更改基本语言定义(如果可能),以避免歧义消失:
: IF '(' cond ')' THEN statement ENDIF
| IF '(' cond ')' THEN statement ELSE statement ENDIF
答案 1 :(得分:0)
尝试这样的事情:
election_stmt: IF '(' expression ')' statement . selection_stmt_else_part;
selection_stmt_else_part: ELSE statement
|
;
答案 2 :(得分:0)
咳咳,这个问题的正确答案通常是: 什么都不做 。
移位/缩小冲突预期含有模糊语法。它们不是错误,它们是冲突。
冲突将通过偏向转换来解决,这恰好可以解决规范的悬空问题。
野牛甚至有一个%expect n 语句,这样当你确实发生 n 冲突时就不会收到S / R冲突警告。