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"

COLONPROGRAMSEMICOLONEND定義されてい%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