1%token-table
2
3%{
4# include <stdio.h>
5# include <ctype.h>
6
7int regs[26];
8int base;
9
10#ifdef YYBISON
11int yylex(void);
12static void yyerror(const char *s);
13#endif
14
15%}
16
17%start list
18
19%token DIGIT LETTER
20
21%left '|'
22%left '&'
23%left '+' '-'
24%left '*' '/' '%'
25%left UMINUS   /* supplies precedence for unary minus */
26
27%% /* beginning of rules section */
28
29list  :  /* empty */
30      |  list stat '\n'
31      |  list error '\n'
32            {  yyerrok ; }
33      ;
34
35stat  :  expr
36            {  printf("%d\n",$1);}
37      |  LETTER '=' expr
38            {  regs[$1] = $3; }
39      ;
40
41expr  :  '(' expr ')'
42            {  $$ = $2; }
43      |  expr '+' expr
44            {  $$ = $1 + $3; }
45      |  expr '-' expr
46            {  $$ = $1 - $3; }
47      |  expr '*' expr
48            {  $$ = $1 * $3; }
49      |  expr '/' expr
50            {  $$ = $1 / $3; }
51      |  expr '%' expr
52            {  $$ = $1 % $3; }
53      |  expr '&' expr
54            {  $$ = $1 & $3; }
55      |  expr '|' expr
56            {  $$ = $1 | $3; }
57      |  '-' expr %prec UMINUS
58            {  $$ = - $2; }
59      |  LETTER
60            {  $$ = regs[$1]; }
61      |  number
62      ;
63
64number:  DIGIT
65         {  $$ = $1; base = ($1==0) ? 8 : 10; }
66      |  number DIGIT
67         {  $$ = base * $1 + $2; }
68      ;
69
70%% /* start of programs */
71
72#ifdef YYBYACC
73extern int YYLEX_DECL();
74#endif
75
76int
77main (void)
78{
79    while(!feof(stdin)) {
80	yyparse();
81    }
82    return 0;
83}
84
85static void
86yyerror(const char *s)
87{
88    fprintf(stderr, "%s\n", s);
89}
90
91int
92yylex(void)
93{
94	/* lexical analysis routine */
95	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
96	/* return DIGIT for a digit, yylval = 0 through 9 */
97	/* all other characters are returned immediately */
98
99    int c;
100
101    while( (c=getchar()) == ' ' )   { /* skip blanks */ }
102
103    /* c is now nonblank */
104
105    if( islower( c )) {
106	yylval = c - 'a';
107	return ( LETTER );
108    }
109    if( isdigit( c )) {
110	yylval = c - '0';
111	return ( DIGIT );
112    }
113    return( c );
114}
115