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