Commit | Line | Data |
---|---|---|
c9c1d0b1 CC |
1 | Virgin BTL M4 as sent out in 4.1 |
2 | /* @(#)m4y.y 1.1 (Berkeley) %G% */ | |
3 | %{ | |
4 | extern long evalval; | |
5 | #define YYSTYPE long | |
6 | %} | |
7 | ||
8 | %term DIGITS | |
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 '|' e ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; } | |
24 | | e '&' e ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; } | |
25 | | '!' e ={ $$ = $2 == 0; } | |
26 | | e EQ e ={ $$ = $1 == $3; } | |
27 | | e NE e ={ $$ = $1 != $3; } | |
28 | | e GT e ={ $$ = $1 > $3; } | |
29 | | e GE e ={ $$ = $1 >= $3; } | |
30 | | e LT e ={ $$ = $1 < $3; } | |
31 | | e LE e ={ $$ = $1 <= $3; } | |
32 | | e '+' 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 ')' ={ $$ = ($2); } | |
38 | | e POWER e ={ for ($$=1; $3-->0; $$ *= $1); } | |
39 | | '-' e %prec UMINUS ={ $$ = $2-1; $$ = -$2; } | |
40 | | '+' e %prec UMINUS ={ $$ = $2-1; $$ = $2; } | |
41 | | DIGITS ={ $$ = evalval; } | |
42 | ; | |
43 | ||
44 | %% | |
45 | ||
46 | yylex() { | |
47 | extern char *pe; | |
48 | ||
49 | while (*pe==' ' || *pe=='\t' || *pe=='\n') | |
50 | pe++; | |
51 | switch(*pe) { | |
52 | case '\0': | |
53 | case '+': | |
54 | case '-': | |
55 | case '/': | |
56 | case '%': | |
57 | case '(': | |
58 | case ')': | |
59 | return(*pe++); | |
60 | case '^': | |
61 | pe++; | |
62 | return(POWER); | |
63 | case '*': | |
64 | return(peek('*', POWER, '*')); | |
65 | case '>': | |
66 | return(peek('=', GE, GT)); | |
67 | case '<': | |
68 | return(peek('=', LE, LT)); | |
69 | case '=': | |
70 | return(peek('=', EQ, EQ)); | |
71 | case '|': | |
72 | return(peek('|', '|', '|')); | |
73 | case '&': | |
74 | return(peek('&', '&', '&')); | |
75 | case '!': | |
76 | return(peek('=', NE, '!')); | |
77 | default: | |
78 | evalval = 0; | |
79 | while (*pe >= '0' && *pe <= '9') | |
80 | evalval = evalval*10 + *pe++ - '0'; | |
81 | return(DIGITS); | |
82 | } | |
83 | } | |
84 | ||
85 | peek(c, r1, r2) | |
86 | { | |
87 | if (*++pe != c) | |
88 | return(r2); | |
89 | ++pe; | |
90 | return(r1); | |
91 | } | |
92 | ||
93 | yyerror(s) | |
94 | char *s; | |
95 | { | |
96 | } |