我正在尝试用野牛编写一个解析器。 我收到警告:
warning: 5 shift/reduce conflicts [-Wconflicts-sr]
我的规则:
%%
Prog : F {};
F : {};
F : D F {};
D : R ID LP Fr RP LB Ss RB {};
R : T {};
R : VOID {};
Fr : {};
Fr : Fl {};
Fl : Fd COM Fl1 {};
Fl1 : | Fl1 Fd COM {};
Fd : T ID Fd1{};
Fd1 : LB NUM BM RB{};
BM : B | {};
Ss : S | Ss S {};
S : LB Ss RB {};
S : T ID SC {};
S : T ID ASGN E SC {};
S : T ID LB NUM RB SC {};
S : T ID LB NUM B RB SC {};
S : ID ASGN E SC {};
S : ID LB E RB ASGN E SC {};
S : C SC {};
S : RET SC {};
S : RET E SC {};
S : IF LP E RP S {};
S : WHILE LP El RP S {};
S : BREAK SC {};
C : ID LP ElM RP {};
ElM : El | {};
El : E El1{};
El1 : | COM El {};
T : INT | BYTE | BOOL {};
E : LP E RP | ID LB E RP |ID | C | NUM | NUM B | STR | TRUE | FALSE | NOT E | E Op E {};
Op : AND | OR | RLP | BNP {};
%%
我怎么知道冲突在哪里?我尝试过组合规则,但冲突的数量从未改变。可能是什么原因?
bison的-v
选项会导致bison生成一个y.output
文件(实际上称为whatever.output,其中"whatever"是输入文件的基本名称,除非您使用yacc兼容性(。
y.output 文件包含从语法生成的解析器的完整摘要 - 所有规则、所有解析器状态以及状态中的所有操作。 它还标识哪些状态包含所有冲突以及如何解决这些冲突以生成解析器。