1319297Sdelphij%token-table
2319297Sdelphij
3234949Sbapt%{
4234949Sbapt# include <stdio.h>
5234949Sbapt# include <ctype.h>
6234949Sbapt
7234949Sbaptint regs[26];
8234949Sbaptint base;
9234949Sbapt
10234949Sbapt#ifdef YYBISON
11234949Sbaptint yylex(void);
12234949Sbaptstatic void yyerror(const char *s);
13234949Sbapt#endif
14234949Sbapt
15234949Sbapt%}
16234949Sbapt
17234949Sbapt%start list
18234949Sbapt
19234949Sbapt%token DIGIT LETTER
20234949Sbapt
21234949Sbapt%left '|'
22234949Sbapt%left '&'
23234949Sbapt%left '+' '-'
24234949Sbapt%left '*' '/' '%'
25234949Sbapt%left UMINUS   /* supplies precedence for unary minus */
26234949Sbapt
27234949Sbapt%% /* beginning of rules section */
28234949Sbapt
29234949Sbaptlist  :  /* empty */
30234949Sbapt      |  list stat '\n'
31234949Sbapt      |  list error '\n'
32234949Sbapt            {  yyerrok ; }
33234949Sbapt      ;
34234949Sbapt
35234949Sbaptstat  :  expr
36234949Sbapt            {  printf("%d\n",$1);}
37234949Sbapt      |  LETTER '=' expr
38234949Sbapt            {  regs[$1] = $3; }
39234949Sbapt      ;
40234949Sbapt
41234949Sbaptexpr  :  '(' expr ')'
42234949Sbapt            {  $$ = $2; }
43234949Sbapt      |  expr '+' expr
44234949Sbapt            {  $$ = $1 + $3; }
45234949Sbapt      |  expr '-' expr
46234949Sbapt            {  $$ = $1 - $3; }
47234949Sbapt      |  expr '*' expr
48234949Sbapt            {  $$ = $1 * $3; }
49234949Sbapt      |  expr '/' expr
50234949Sbapt            {  $$ = $1 / $3; }
51234949Sbapt      |  expr '%' expr
52234949Sbapt            {  $$ = $1 % $3; }
53234949Sbapt      |  expr '&' expr
54234949Sbapt            {  $$ = $1 & $3; }
55234949Sbapt      |  expr '|' expr
56234949Sbapt            {  $$ = $1 | $3; }
57234949Sbapt      |  '-' expr %prec UMINUS
58234949Sbapt            {  $$ = - $2; }
59234949Sbapt      |  LETTER
60234949Sbapt            {  $$ = regs[$1]; }
61234949Sbapt      |  number
62234949Sbapt      ;
63234949Sbapt
64234949Sbaptnumber:  DIGIT
65234949Sbapt         {  $$ = $1; base = ($1==0) ? 8 : 10; }
66234949Sbapt      |  number DIGIT
67234949Sbapt         {  $$ = base * $1 + $2; }
68234949Sbapt      ;
69234949Sbapt
70234949Sbapt%% /* start of programs */
71234949Sbapt
72234949Sbapt#ifdef YYBYACC
73234949Sbaptextern int YYLEX_DECL();
74234949Sbapt#endif
75234949Sbapt
76234949Sbaptint
77234949Sbaptmain (void)
78234949Sbapt{
79234949Sbapt    while(!feof(stdin)) {
80234949Sbapt	yyparse();
81234949Sbapt    }
82234949Sbapt    return 0;
83234949Sbapt}
84234949Sbapt
85234949Sbaptstatic void
86234949Sbaptyyerror(const char *s)
87234949Sbapt{
88234949Sbapt    fprintf(stderr, "%s\n", s);
89234949Sbapt}
90234949Sbapt
91234949Sbaptint
92234949Sbaptyylex(void)
93234949Sbapt{
94234949Sbapt	/* lexical analysis routine */
95234949Sbapt	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
96234949Sbapt	/* return DIGIT for a digit, yylval = 0 through 9 */
97234949Sbapt	/* all other characters are returned immediately */
98234949Sbapt
99234949Sbapt    int c;
100234949Sbapt
101234949Sbapt    while( (c=getchar()) == ' ' )   { /* skip blanks */ }
102234949Sbapt
103234949Sbapt    /* c is now nonblank */
104234949Sbapt
105234949Sbapt    if( islower( c )) {
106234949Sbapt	yylval = c - 'a';
107234949Sbapt	return ( LETTER );
108234949Sbapt    }
109234949Sbapt    if( isdigit( c )) {
110234949Sbapt	yylval = c - '0';
111234949Sbapt	return ( DIGIT );
112234949Sbapt    }
113234949Sbapt    return( c );
114234949Sbapt}
115