ここで見つけたいくつかの解決策を試しましたが、うまくいきませんでした (間違って適用した可能性があります)。ここに私の文法の一部があります:
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