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