本文介绍了此Bison代码中的移位/减少冲突来自何处?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试解析此语法:

I'm trying to parse this syntax:

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

我希望这样接地:

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

这是BISON的代码:

This is the code for 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

我该如何解决?

推荐答案

问题在于您对term的定义:

term: NUMBER | term op term ;

在解析此数字时,每个数字的问题是:我是否应该阅读另一个令牌以知道我是第一种形式还是第二种形式.

When parsing this, at each number, the question is: should I read another token to know if I have the first, or the second form.

一种解决方案可能是定义:

A solution could be to define:

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

语法经过修改后,如下所示:

The grammar, once adapted, looks like the following:

%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进行编译而不会发出警告.

compiles without warnings with bison (GNU Bison) 2.4.1.

这篇关于此Bison代码中的移位/减少冲突来自何处?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 21:16