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