Bell 32V development
[unix-history] / usr / src / cmd / m4 / m4y.y
CommitLineData
3242d078
TL
1%{
2extern 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
17s : e ={ evalval = $1; }
18 | ={ evalval = 0; }
19 ;
20
21e : 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
44yylex() {
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
83peek(c, r1, r2)
84{
85 if (*++pe != c)
86 return(r2);
87 ++pe;
88 return(r1);
89}
90
91yyerror(s)
92char *s;
93{
94}