%{
extern int yylval;
extern int s_cpLine;
%}
%token CONSTANT
%token EQ NE LE GE LS RS
%token AND_OP OR_OP
%left ','
%right '='
%right '?' ':'
%left OR_OP
%left AND_OP
%left '|' '^'
%left '&'
%binary EQ NE
%binary '<' '>' LE GE
%left LS RS
%left '+' '-'
%left '*' '/' '%'
%right '!' '~' UMINUS
%start start
%%
start: e { return($1); }
| error { return(0); }
;
e: e '*' e {$$ = $1 * $3;}
| e '/' e {
if ($3 == 0) $$ = $1;
else $$ = $1 / $3;
}
| e '%' e {
if ($3 == 0) $$ = $1;
else $$ = $1 % $3;
}
| e '+' e {$$ = $1 + $3;}
| e '-' e {$$ = $1 - $3;}
| e LS e {$$ = $1 << $3;}
| e RS e {$$ = $1 >> $3;}
| e '<' e {$$ = $1 < $3;}
| e '>' e {$$ = $1 > $3;}
| e LE e {$$ = $1 <= $3;}
| e GE e {$$ = $1 >= $3;}
| e EQ e {$$ = $1 == $3;}
| e NE e {$$ = $1 != $3;}
| e '&' e {$$ = $1 & $3;}
| e '^' e {$$ = $1 ^ $3;}
| e '|' e {$$ = $1 | $3;}
| e AND_OP e {$$ = $1 && $3;}
| e OR_OP e {$$ = $1 || $3;}
| e '?' e ':' e {$$ = $1 ? $3 : $5;}
| e ',' e {$$ = $3;}
| '-' e %prec UMINUS {$$ = -$2;}
| '!' e {$$ = !$2;}
| '~' e {$$ = ~$2;}
| '(' e ')' {$$ = $2;}
| CONSTANT {$$= yylval;}
;
%%
int yyerror(char *s) {
int i,c;
printf("line %d : %s", s_cpLine, s);
return(0);
}