|
|
1.1 root 1: %{
2: extern long evalval;
3: #define YYSTYPE long
4: %}
5:
6: %term DIGITS
7: %left OROR
8: %left ANDAND
9: %left '|' '^'
10: %left '&'
11: %right '!' '~'
12: %nonassoc GT GE LT LE NE EQ
13: %left '+' '-'
14: %left '*' '/' '%'
15: %right POWER
16: %right UMINUS
17: %%
18:
19: s : e ={ evalval = $1; }
20: | ={ evalval = 0; }
21: ;
22:
23: e : e OROR e ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; }
24: | e ANDAND e ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; }
25: | '!' e ={ $$ = $2 == 0; }
26: | '~' e ={ $$ = ~$2; }
27: | e EQ e ={ $$ = $1 == $3; }
28: | e NE e ={ $$ = $1 != $3; }
29: | e GT e ={ $$ = $1 > $3; }
30: | e GE e ={ $$ = $1 >= $3; }
31: | e LT e ={ $$ = $1 < $3; }
32: | e LE e ={ $$ = $1 <= $3; }
33: | e '|' e ={ $$ = ($1|$3); }
34: | e '&' e ={ $$ = ($1&$3); }
35: | e '^' e ={ $$ = ($1^$3); }
36: | e '+' e ={ $$ = ($1+$3); }
37: | e '-' e ={ $$ = ($1-$3); }
38: | e '*' e ={ $$ = ($1*$3); }
39: | e '/' e ={ $$ = ($1/$3); }
40: | e '%' e ={ $$ = ($1%$3); }
41: | '(' e ')' ={ $$ = ($2); }
42: | e POWER e ={ for ($$=1; $3-->0; $$ *= $1); }
43: | '-' e %prec UMINUS ={ $$ = $2-1; $$ = -$2; }
44: | '+' e %prec UMINUS ={ $$ = $2-1; $$ = $2; }
45: | DIGITS ={ $$ = evalval; }
46: ;
47:
48: %%
49:
50: extern char *pe;
51:
52: yylex() {
53:
54: while (*pe==' ' || *pe=='\t' || *pe=='\n')
55: pe++;
56: switch(*pe) {
57: case '\0':
58: case '+':
59: case '-':
60: case '/':
61: case '%':
62: case '^':
63: case '~':
64: case '(':
65: case ')':
66: return(*pe++);
67: case '*':
68: return(peek('*', POWER, '*'));
69: case '>':
70: return(peek('=', GE, GT));
71: case '<':
72: return(peek('=', LE, LT));
73: case '=':
74: return(peek('=', EQ, EQ));
75: case '|':
76: return(peek('|', OROR, '|'));
77: case '&':
78: return(peek('&', ANDAND, '&'));
79: case '!':
80: return(peek('=', NE, '!'));
81: default: {
82: register base;
83:
84: evalval = 0;
85:
86: if (*pe == '0') {
87: if (*++pe=='x' || *pe=='X') {
88: base = 16;
89: ++pe;
90: } else
91: base = 8;
92: } else
93: base = 10;
94:
95: for (;;) {
96: register c, dig;
97:
98: c = *pe;
99:
100: if (c>='0' && c<='9')
101: dig = c - '0';
102: else if (c>='a' && c<='f')
103: dig = c - 'a' + 10;
104: else if (c>='A' && c<='F')
105: dig = c - 'A' + 10;
106: else
107: break;
108:
109: evalval = evalval*base + dig;
110: ++pe;
111: }
112:
113: return(DIGITS);
114: }
115: }
116: }
117:
118: peek(c, r1, r2)
119: {
120: if (*++pe != c)
121: return(r2);
122: ++pe;
123: return(r1);
124: }
125:
126: yyerror() {;}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.