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