Yacc/野牛,通过对数学运算进行分组来最小化数量 [英] Yacc/Bison, minimize amount by grouping math ops
问题描述
我在这里查看calc来源 http://epaperpress.com/lexandyacc/ >
我在calc.y中看到这些行
| expr '+' expr { $$ = opr('+', 2, $1, $3); }
| expr '-' expr { $$ = opr('-', 2, $1, $3); }
| expr '*' expr { $$ = opr('*', 2, $1, $3); }
| expr '/' expr { $$ = opr('/', 2, $1, $3); }
| expr '<' expr { $$ = opr('<', 2, $1, $3); }
| expr '>' expr { $$ = opr('>', 2, $1, $3); }
是否可以对它们进行分组?所以我可以写类似下面的内容?
| expr mathOp expr { $$ = opr(mathOp, 2, $1, $3); }
| expr cmpOp expr { $$ = opr(cmpOp, 2, $1, $3); }
注意:我正在用野牛.
像这样对它们进行分组的问题是,您失去了规则的优先级-您只有一条规则具有不同的优先级,具体取决于它的Mathop ,野牛/yacc无法处理.也就是说,您可以将相同优先级的操作分组在一起
expr: expr mulOp expr { $$ = opr($2, 2, $1, $3); } %prec '*'
| expr addOp expr { $$ = opr($2, 2, $1, $3); } %prec '+'
| expr relOp expr { $$ = opr($2, 2, $1, $3); } %prec '<'
:
mulOp: '*' { $$ = '*'; }
| '/' { $$ = '/'; }
;
I am looking at the calc source here http://epaperpress.com/lexandyacc/
I see theses lines in calc.y
| expr '+' expr { $$ = opr('+', 2, $1, $3); }
| expr '-' expr { $$ = opr('-', 2, $1, $3); }
| expr '*' expr { $$ = opr('*', 2, $1, $3); }
| expr '/' expr { $$ = opr('/', 2, $1, $3); }
| expr '<' expr { $$ = opr('<', 2, $1, $3); }
| expr '>' expr { $$ = opr('>', 2, $1, $3); }
Is there a way to group them? so i can write something like the below instead?
| expr mathOp expr { $$ = opr(mathOp, 2, $1, $3); }
| expr cmpOp expr { $$ = opr(cmpOp, 2, $1, $3); }
NOTE: I am using bison.
The problem with grouping them like that is that you lose the precedences on the rules -- you only have one rule that has different precedence depending on which mathop it is, which bison/yacc cannot handle. That said, you CAN group ops of the same precedence level together
expr: expr mulOp expr { $$ = opr($2, 2, $1, $3); } %prec '*'
| expr addOp expr { $$ = opr($2, 2, $1, $3); } %prec '+'
| expr relOp expr { $$ = opr($2, 2, $1, $3); } %prec '<'
:
mulOp: '*' { $$ = '*'; }
| '/' { $$ = '/'; }
;
这篇关于Yacc/野牛,通过对数学运算进行分组来最小化数量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!