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