这个yacc解析器有什么冲突?

时间:2009-11-18 07:42:29

标签: 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      [reduce using rule 30 (selection_stmt)]
    $default  reduce using rule 30 (selection_stmt)

冲突是什么,以及如何解决?

3 个答案:

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