本文介绍了此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代码中的移位/减少冲突来自何处?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!