Parsing 这个yacc解析器中的冲突是什么?
我使用yacc中的-v选项生成一个y.output文件。在文件的顶部写着 状态98冲突:1班/减少 文件的下一步是:Parsing 这个yacc解析器中的冲突是什么?,parsing,yacc,Parsing,Yacc,我使用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 [
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)
什么是冲突?如何解决冲突?尝试以下方法:
election_stmt: IF '(' expression ')' statement . selection_stmt_else_part;
selection_stmt_else_part: ELSE statement
|
;
几乎每一个使用if/then/else
语句的移位/减少错误都是臭名昭著的问题
对于此代码段:
if (f1):
if (f2):
c1
else:
c2
你(还有Python,因为它有奇怪的缩进规则)知道if
和else
属于哪个,但是解析器并不是那么聪明
如果,它无法判断else
是否属于第一个或第二个
演示如何将LR(n)转换为LR(1)等效值,从而解决问题
另一种选择是更改基础语言定义(如果可能),以便消除歧义:
: IF '(' cond ')' THEN statement ENDIF
| IF '(' cond ')' THEN statement ELSE statement ENDIF
嗯,这个问题的正确答案通常是:什么都不做
移位/减少冲突应使用不明确的语法。它们不是错误,而是冲突
冲突将通过选择shift而不是reduce来解决,这恰好解决了规范的悬挂else问题
bison甚至有一个%expect n语句,这样当正好有n个冲突时,您就不会收到S/R冲突警告。可能重复的