【问题标题】:Conflicts in writing a parser with Bison使用 Bison 编写解析器时的冲突
【发布时间】:2018-05-19 11:29:22
【问题描述】:

我正在尝试使用 Bison 编写解析器。 我收到警告:

 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 {};
%%

我如何知道冲突在哪里?我尝试过组合规则,但冲突的数量从未改变。可能是什么原因?

【问题讨论】:

  • 冲突在你的表达式规则中,或者至少其中一些是。我会从那里开始。过度缩写不会使您的代码易于阅读。

标签: compiler-construction bison shift-reduce-conflict


【解决方案1】:

bison 的-v 选项会导致bison 生成y.output 文件(实际上称为whatever.output,其中'whatever' 是输入文件的基本名称,除非您使用的是yacc 兼容性)。

y.output 文件包含从您的语法生成的解析器的完整摘要——所有规则、所有解析器状态以及状态中的所有操作。它还识别哪些状态包含所有冲突以及如何解决这些冲突以生成解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多