Virgin BTL M4 as sent out in 4.1
/* @(#)m4y.y 1.2 (Berkeley) %G% */
%nonassoc GT GE LT LE NE EQ
e : e '|' e ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; }
| e '&' e ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; }
| '!' e ={ $$ = $2 == 0; }
| e EQ e ={ $$ = $1 == $3; }
| e NE e ={ $$ = $1 != $3; }
| e GT e ={ $$ = $1 > $3; }
| e GE e ={ $$ = $1 >= $3; }
| e LT e ={ $$ = $1 < $3; }
| e LE e ={ $$ = $1 <= $3; }
| e '+' e ={ $$ = ($1+$3); }
| e '-' e ={ $$ = ($1-$3); }
| e '*' e ={ $$ = ($1*$3); }
| e '/' e ={ $$ = ($1/$3); }
| e '%' e ={ $$ = ($1%$3); }
| '(' e ')' ={ $$ = ($2); }
| e POWER e ={ for ($$=1; $3-->0; $$ *= $1); }
| '-' e %prec UMINUS ={ $$ = $2-1; $$ = -$2; }
| '+' e %prec UMINUS ={ $$ = $2-1; $$ = $2; }
| DIGITS ={ $$ = evalval; }
while (*pe==' ' || *pe=='\t' || *pe=='\n')
return(peek('*', POWER, '*'));
return(peek('=', GE, GT));
return(peek('=', LE, LT));
return(peek('=', EQ, EQ));
return(peek('|', '|', '|'));
return(peek('&', '&', '&'));
return(peek('=', NE, '!'));
while (*pe >= '0' && *pe <= '9')
evalval = evalval*10 + *pe++ - '0';