0

我尝试了一些在这里找到的解决方案,但没有奏效(可能是我错误地应用了它们)。这是我的一些语法:

Program: Marker1 PROGRAM DECLARATIONS STATEMENTS END    
;

DECLARATIONS:  DECLARATION SEMICOLON
             | DECLARATION SEMICOLON DECLARATIONS
;


DECLARATION: Marker2 VARIABLES_LIST COLON TYPE
;

STATEMENTS: STATEMENT Stmnt
;
Stmnt:  SEMICOLON STATEMENTS    
|   %empty
;
//More rules that include "STATEMENT" and "VARIABLES_LIST"

COLON, PROGRAM, SEMICOLON,END是用%token(并且实际上只是单词)定义的。我收到以下警告:

Source.ypp: warning: 1 reduce/reduce conflict [-Wconflicts-rr]

我尝试从其他线程应用解决方案,但无法编译,我了解导致它的原因,但我不知道如何解决这个问题。

显然,优先级在这里无济于事,我需要更改语法,但是如何在不分解所有规则的情况下正确更改它(我的规则比这里显示的要多得多-http: //pastebin.com /f308C4jN )?

**PS:我没有使用 YACC

编辑:这是有冲突的状态:

State 15

    4 DECLARATIONS: DECLARATION SEMICOLON .
    5             | DECLARATION SEMICOLON . DECLARATIONS

    ID        reduce using rule 4 (DECLARATIONS)
    ID        [reduce using rule 6 ($@1)]
    $default  reduce using rule 4 (DECLARATIONS)

    DECLARATIONS  go to state 32
    DECLARATION   go to state 6
    $@1           go to state 7

以下是规则 6 和 4:

4 DECLARATIONS: DECLARATION SEMICOLON
5             | DECLARATION SEMICOLON DECLARATIONS

6 $@1: %empty

7 DECLARATION: $@1 VARIABLES_LIST COLON TYPE
4

0 回答 0