这个Bison代码中的转移/减少冲突来自哪里?

时间:2010-07-16 12:38:01

标签: bison

我正在尝试解析这种语法:

34 + 1 − 8, 32 * 87 + 6 / 4, 34 / 8

我期待这样做:

(, (- (+ 34 1) 8) (/ (+ (* 32 87) 6) 4) (/ 34 8))

这是BISON的代码:

%token NUMBER
%token COMMA
%token OPERATOR
%left OPERATOR
%left COMMA
%%

term: NUMBER | term op term ;
op: OPERATOR | COMMA;
%%

有一个问题:

test.y: conflicts: 2 shift/reduce

我该如何解决?

3 个答案:

答案 0 :(得分:11)

要查找冲突的位置,请使用--verbose选项并查看输入文件为example.output的文件example.y。这是我从你的输入中得到的文件:

State 7 conflicts: 2 shift/reduce

(略)

state 7

    2 term: term . op term
    2     | term op term .

    COMMA     shift, and go to state 4
    OPERATOR  shift, and go to state 5

    COMMA     [reduce using rule 2 (term)]
    OPERATOR  [reduce using rule 2 (term)]
    $default  reduce using rule 2 (term)

    op  go to state 6

答案 1 :(得分:3)

问题在于您对term

的定义
term: NUMBER | term op term ;

解析时,在每个数字处,问题是:我应该阅读另一个令牌,知道我是否有第一个或第二个表格。

解决方案可以是定义:

term: NUMBER reminder;
reminder: /* empty */ | op term;

语法一经改编,如下所示:

%token NUMBER
%token COMMA
%token OPERATOR
%left OPERATOR
%left COMMA
%%

term: NUMBER reminder;
reminder: /* empty */ | op term;
op: OPERATOR | COMMA;
%%

使用bison (GNU Bison) 2.4.1进行编译而不发出警告。

答案 2 :(得分:0)

您可能未指定运算符的优先级,例如

%left'+''-'

%left'*''/'

(在定义部分)