我正在尝试解析这种语法:
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
我该如何解决?
答案 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'*''/'
(在定义部分)