%union {
int b;
+ int n;
char* str;
}
%token <str> CONST
-%left EQ
+%token <n> NUM
+%left EQ NEQ GE LE GT LT
%left '|' '&' '^'
%left '!'
%type <b> boo
| error '\n' { yyerrok; }
;
-boo: CONST EQ CONST { $$ = ! strcmp($1, $3); }
- | boo EQ boo { $$ = $1 == $3 }
+boo: CONST EQ CONST { $$ = ! strcmp($1, $3); }
+ | CONST NEQ CONST { $$ = !! strcmp($1, $3); }
+ | NUM EQ NUM { $$ = $1 == $3 }
+ | NUM NEQ NUM { $$ = $1 != $3 }
+ | NUM GE NUM { $$ = $1 >= $3 }
+ | NUM LE NUM { $$ = $1 <= $3 }
+ | NUM GT NUM { $$ = $1 > $3 }
+ | NUM LT NUM { $$ = $1 < $3 }
| boo '|' boo { $$ = $1 || $3 }
| boo '&' boo { $$ = $1 && $3 }
| boo '^' boo { $$ = ($1 || $3) && !($1 && $3) }
return CONST;
}
+ if (isdigit(c)){
+ ungetc(c,stdin);
+ scanf("%d",&yylval.n);
+ return NUM;
+ }
+
+ if (c == '!'){
+ if ((c = getchar ()) == '=')
+ return NEQ;
+ }
+
+ if (c == '<'){
+ if ((c = getchar ()) == '=')
+ return LE;
+ else
+ return LT;
+ }
+
+ if (c == '>'){
+ if ((c = getchar ()) == '=')
+ return GE;
+ else
+ return GT;
+ }
+
if (c == '='){
if ((c = getchar ()) == '=')
return EQ;