Commit | Line | Data |
---|---|---|
3242d078 TL |
1 | %{ |
2 | extern long evalval; | |
3 | #define YYSTYPE long | |
4 | %} | |
5 | ||
6 | %term DIGITS | |
7 | %left '|' | |
8 | %left '&' | |
9 | %right '!' | |
10 | %nonassoc GT GE LT LE NE EQ | |
11 | %left '+' '-' | |
12 | %left '*' '/' '%' | |
13 | %right POWER | |
14 | %right UMINUS | |
15 | %% | |
16 | ||
17 | s : e ={ evalval = $1; } | |
18 | | ={ evalval = 0; } | |
19 | ; | |
20 | ||
21 | e : e '|' e ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; } | |
22 | | e '&' e ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; } | |
23 | | '!' e ={ $$ = $2 == 0; } | |
24 | | e EQ e ={ $$ = $1 == $3; } | |
25 | | e NE e ={ $$ = $1 != $3; } | |
26 | | e GT e ={ $$ = $1 > $3; } | |
27 | | e GE e ={ $$ = $1 >= $3; } | |
28 | | e LT e ={ $$ = $1 < $3; } | |
29 | | e LE e ={ $$ = $1 <= $3; } | |
30 | | e '+' e ={ $$ = ($1+$3); } | |
31 | | e '-' e ={ $$ = ($1-$3); } | |
32 | | e '*' e ={ $$ = ($1*$3); } | |
33 | | e '/' e ={ $$ = ($1/$3); } | |
34 | | e '%' e ={ $$ = ($1%$3); } | |
35 | | '(' e ')' ={ $$ = ($2); } | |
36 | | e POWER e ={ for ($$=1; $3-->0; $$ *= $1); } | |
37 | | '-' e %prec UMINUS ={ $$ = $2-1; $$ = -$2; } | |
38 | | '+' e %prec UMINUS ={ $$ = $2-1; $$ = $2; } | |
39 | | DIGITS ={ $$ = evalval; } | |
40 | ; | |
41 | ||
42 | %% | |
43 | ||
44 | yylex() { | |
45 | extern char *pe; | |
46 | ||
47 | while (*pe==' ' || *pe=='\t' || *pe=='\n') | |
48 | pe++; | |
49 | switch(*pe) { | |
50 | case '\0': | |
51 | case '+': | |
52 | case '-': | |
53 | case '/': | |
54 | case '%': | |
55 | case '(': | |
56 | case ')': | |
57 | return(*pe++); | |
58 | case '^': | |
59 | pe++; | |
60 | return(POWER); | |
61 | case '*': | |
62 | return(peek('*', POWER, '*')); | |
63 | case '>': | |
64 | return(peek('=', GE, GT)); | |
65 | case '<': | |
66 | return(peek('=', LE, LT)); | |
67 | case '=': | |
68 | return(peek('=', EQ, EQ)); | |
69 | case '|': | |
70 | return(peek('|', '|', '|')); | |
71 | case '&': | |
72 | return(peek('&', '&', '&')); | |
73 | case '!': | |
74 | return(peek('=', NE, '!')); | |
75 | default: | |
76 | evalval = 0; | |
77 | while (*pe >= '0' && *pe <= '9') | |
78 | evalval = evalval*10 + *pe++ - '0'; | |
79 | return(DIGITS); | |
80 | } | |
81 | } | |
82 | ||
83 | peek(c, r1, r2) | |
84 | { | |
85 | if (*++pe != c) | |
86 | return(r2); | |
87 | ++pe; | |
88 | return(r1); | |
89 | } | |
90 | ||
91 | yyerror(s) | |
92 | char *s; | |
93 | { | |
94 | } |