Yacc/Bison,通过分组数学运算来最小化数量

4 yacc bison

我在这里查看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); }
Run Code Online (Sandbox Code Playgroud)

有没有办法将它们分组?所以我可以写下面的东西而不是?

| expr mathOp expr         { $$ = opr(mathOp, 2, $1, $3); }
| expr cmpOp  expr         { $$ = opr(cmpOp, 2, $1, $3); }
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用野牛.

Chr*_*odd 6

将它们分组的问题在于您丢失了规则的优先级 - 您只有一个规则具有不同的优先级,具体取决于它是哪个mathop,哪个bison/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: '*' { $$ = '*'; }
     | '/' { $$ = '/'; }
;
Run Code Online (Sandbox Code Playgroud)