Parsing 这个yacc解析器中的冲突是什么?

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 [

我使用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)

什么是冲突?如何解决冲突?

尝试以下方法:

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冲突警告。

可能重复的