xref: /freebsd/contrib/byacc/test/calc2.y (revision 6cec9cad762b6476313fb1f8e931a1647822db6b)
198e903e7SBaptiste Daroussin %parse-param { int regs[26] }
298e903e7SBaptiste Daroussin %parse-param { int *base }
398e903e7SBaptiste Daroussin 
498e903e7SBaptiste Daroussin %lex-param { int *base }
598e903e7SBaptiste Daroussin 
698e903e7SBaptiste Daroussin %{
798e903e7SBaptiste Daroussin # include <stdio.h>
898e903e7SBaptiste Daroussin # include <ctype.h>
998e903e7SBaptiste Daroussin 
1098e903e7SBaptiste Daroussin #ifdef YYBISON
1198e903e7SBaptiste Daroussin #define YYLEX_PARAM base
1298e903e7SBaptiste Daroussin #define YYLEX_DECL() yylex(int *YYLEX_PARAM)
1398e903e7SBaptiste Daroussin #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
1498e903e7SBaptiste Daroussin int YYLEX_DECL();
1598e903e7SBaptiste Daroussin static void YYERROR_DECL();
1698e903e7SBaptiste Daroussin #endif
1798e903e7SBaptiste Daroussin 
1898e903e7SBaptiste Daroussin %}
1998e903e7SBaptiste Daroussin 
2098e903e7SBaptiste Daroussin %start list
2198e903e7SBaptiste Daroussin 
2298e903e7SBaptiste Daroussin %token DIGIT LETTER
2398e903e7SBaptiste Daroussin 
2498e903e7SBaptiste Daroussin %left '|'
2598e903e7SBaptiste Daroussin %left '&'
2698e903e7SBaptiste Daroussin %left '+' '-'
2798e903e7SBaptiste Daroussin %left '*' '/' '%'
2898e903e7SBaptiste Daroussin %left UMINUS   /* supplies precedence for unary minus */
2998e903e7SBaptiste Daroussin 
3098e903e7SBaptiste Daroussin %% /* beginning of rules section */
3198e903e7SBaptiste Daroussin 
3298e903e7SBaptiste Daroussin list  :  /* empty */
3398e903e7SBaptiste Daroussin       |  list stat '\n'
3498e903e7SBaptiste Daroussin       |  list error '\n'
3598e903e7SBaptiste Daroussin             {  yyerrok ; }
3698e903e7SBaptiste Daroussin       ;
3798e903e7SBaptiste Daroussin 
3898e903e7SBaptiste Daroussin stat  :  expr
3998e903e7SBaptiste Daroussin             {  printf("%d\n",$1);}
4098e903e7SBaptiste Daroussin       |  LETTER '=' expr
4198e903e7SBaptiste Daroussin             {  regs[$1] = $3; }
4298e903e7SBaptiste Daroussin       ;
4398e903e7SBaptiste Daroussin 
4498e903e7SBaptiste Daroussin expr  :  '(' expr ')'
4598e903e7SBaptiste Daroussin             {  $$ = $2; }
4698e903e7SBaptiste Daroussin       |  expr '+' expr
4798e903e7SBaptiste Daroussin             {  $$ = $1 + $3; }
4898e903e7SBaptiste Daroussin       |  expr '-' expr
4998e903e7SBaptiste Daroussin             {  $$ = $1 - $3; }
5098e903e7SBaptiste Daroussin       |  expr '*' expr
5198e903e7SBaptiste Daroussin             {  $$ = $1 * $3; }
5298e903e7SBaptiste Daroussin       |  expr '/' expr
5398e903e7SBaptiste Daroussin             {  $$ = $1 / $3; }
5498e903e7SBaptiste Daroussin       |  expr '%' expr
5598e903e7SBaptiste Daroussin             {  $$ = $1 % $3; }
5698e903e7SBaptiste Daroussin       |  expr '&' expr
5798e903e7SBaptiste Daroussin             {  $$ = $1 & $3; }
5898e903e7SBaptiste Daroussin       |  expr '|' expr
5998e903e7SBaptiste Daroussin             {  $$ = $1 | $3; }
6098e903e7SBaptiste Daroussin       |  '-' expr %prec UMINUS
6198e903e7SBaptiste Daroussin             {  $$ = - $2; }
6298e903e7SBaptiste Daroussin       |  LETTER
6398e903e7SBaptiste Daroussin             {  $$ = regs[$1]; }
6498e903e7SBaptiste Daroussin       |  number
6598e903e7SBaptiste Daroussin       ;
6698e903e7SBaptiste Daroussin 
6798e903e7SBaptiste Daroussin number:  DIGIT
6898e903e7SBaptiste Daroussin          {  $$ = $1; (*base) = ($1==0) ? 8 : 10; }
6998e903e7SBaptiste Daroussin       |  number DIGIT
7098e903e7SBaptiste Daroussin          {  $$ = (*base) * $1 + $2; }
7198e903e7SBaptiste Daroussin       ;
7298e903e7SBaptiste Daroussin 
7398e903e7SBaptiste Daroussin %% /* start of programs */
7498e903e7SBaptiste Daroussin 
7598e903e7SBaptiste Daroussin #ifdef YYBYACC
7698e903e7SBaptiste Daroussin extern int YYLEX_DECL();
7798e903e7SBaptiste Daroussin #endif
7898e903e7SBaptiste Daroussin 
7998e903e7SBaptiste Daroussin int
main(void)8098e903e7SBaptiste Daroussin main (void)
8198e903e7SBaptiste Daroussin {
8298e903e7SBaptiste Daroussin     int regs[26];
8398e903e7SBaptiste Daroussin     int base = 10;
8498e903e7SBaptiste Daroussin 
8598e903e7SBaptiste Daroussin     while(!feof(stdin)) {
8698e903e7SBaptiste Daroussin 	yyparse(regs, &base);
8798e903e7SBaptiste Daroussin     }
8898e903e7SBaptiste Daroussin     return 0;
8998e903e7SBaptiste Daroussin }
9098e903e7SBaptiste Daroussin 
91*0c8de5b0SBaptiste Daroussin #define UNUSED(x) ((void)(x))
92*0c8de5b0SBaptiste Daroussin 
9398e903e7SBaptiste Daroussin static void
YYERROR_DECL()9498e903e7SBaptiste Daroussin YYERROR_DECL()
9598e903e7SBaptiste Daroussin {
96*0c8de5b0SBaptiste Daroussin     UNUSED(regs); /* %parse-param regs is not actually used here */
97*0c8de5b0SBaptiste Daroussin     UNUSED(base); /* %parse-param base is not actually used here */
9898e903e7SBaptiste Daroussin     fprintf(stderr, "%s\n", s);
9998e903e7SBaptiste Daroussin }
10098e903e7SBaptiste Daroussin 
10198e903e7SBaptiste Daroussin int
YYLEX_DECL()10298e903e7SBaptiste Daroussin YYLEX_DECL()
10398e903e7SBaptiste Daroussin {
10498e903e7SBaptiste Daroussin 	/* lexical analysis routine */
10598e903e7SBaptiste Daroussin 	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
10698e903e7SBaptiste Daroussin 	/* return DIGIT for a digit, yylval = 0 through 9 */
10798e903e7SBaptiste Daroussin 	/* all other characters are returned immediately */
10898e903e7SBaptiste Daroussin 
10998e903e7SBaptiste Daroussin     int c;
11098e903e7SBaptiste Daroussin 
11198e903e7SBaptiste Daroussin     while( (c=getchar()) == ' ' )   { /* skip blanks */ }
11298e903e7SBaptiste Daroussin 
11398e903e7SBaptiste Daroussin     /* c is now nonblank */
11498e903e7SBaptiste Daroussin 
11598e903e7SBaptiste Daroussin     if( islower( c )) {
11698e903e7SBaptiste Daroussin 	yylval = c - 'a';
11798e903e7SBaptiste Daroussin 	return ( LETTER );
11898e903e7SBaptiste Daroussin     }
11998e903e7SBaptiste Daroussin     if( isdigit( c )) {
12098e903e7SBaptiste Daroussin 	yylval = (c - '0') % (*base);
12198e903e7SBaptiste Daroussin 	return ( DIGIT );
12298e903e7SBaptiste Daroussin     }
12398e903e7SBaptiste Daroussin     return( c );
12498e903e7SBaptiste Daroussin }
125