我尝试了一些我在这里找到的解决方案,但它没有用(可能是因为我错误地应用了它们)。 这是我的一些语法:
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]
我尝试应用其他线程的解决方案,但我无法编译,我明白是什么导致它但我无法弄清楚如何解决这个问题。
显然优先权在这里没有帮助,我需要改变我的语法,但是如何在不破坏我所有规则的情况下正确地改变它(我有比我在这里显示的规则更多的规则 - {{3} })?
** P.S:我没有使用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