I am looking at the calc source here http://epaperpress.com/lexandyacc/
I see theses lines in calc.y
| expr \'+\' expr { $$ = opr(\'+\', 2,
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: '*' { $$ = '*'; }
| '/' { $$ = '/'; }
;
You can do it in 2 ways:
Using mathOp as nonterminal you can return some associated value:
mathOp : '+' { $$ = '+'; } | '-' { $$ = '-'; } ...
Then usage will look like (pay attention to $2):
| expr mathOp expr { $$ = opr($2, 2, $1, $3); }
may be you would like to define more complicated mathOp then use %type