xref: /freebsd/contrib/byacc/test/code_calc.y (revision 242b24828472137ec4411826b86e753d49bd2c39)
1*c5b5d71aSJung-uk Kim %token-table
2*c5b5d71aSJung-uk Kim 
398e903e7SBaptiste Daroussin %{
498e903e7SBaptiste Daroussin # include <stdio.h>
598e903e7SBaptiste Daroussin # include <ctype.h>
698e903e7SBaptiste Daroussin 
798e903e7SBaptiste Daroussin int regs[26];
898e903e7SBaptiste Daroussin int base;
998e903e7SBaptiste Daroussin 
1098e903e7SBaptiste Daroussin #ifdef YYBISON
1198e903e7SBaptiste Daroussin int yylex(void);
1298e903e7SBaptiste Daroussin static void yyerror(const char *s);
1398e903e7SBaptiste Daroussin #endif
1498e903e7SBaptiste Daroussin 
1598e903e7SBaptiste Daroussin %}
1698e903e7SBaptiste Daroussin 
1798e903e7SBaptiste Daroussin %start list
1898e903e7SBaptiste Daroussin 
1998e903e7SBaptiste Daroussin %token DIGIT LETTER
2098e903e7SBaptiste Daroussin 
2198e903e7SBaptiste Daroussin %left '|'
2298e903e7SBaptiste Daroussin %left '&'
2398e903e7SBaptiste Daroussin %left '+' '-'
2498e903e7SBaptiste Daroussin %left '*' '/' '%'
2598e903e7SBaptiste Daroussin %left UMINUS   /* supplies precedence for unary minus */
2698e903e7SBaptiste Daroussin 
2798e903e7SBaptiste Daroussin %% /* beginning of rules section */
2898e903e7SBaptiste Daroussin 
2998e903e7SBaptiste Daroussin list  :  /* empty */
3098e903e7SBaptiste Daroussin       |  list stat '\n'
3198e903e7SBaptiste Daroussin       |  list error '\n'
3298e903e7SBaptiste Daroussin             {  yyerrok ; }
3398e903e7SBaptiste Daroussin       ;
3498e903e7SBaptiste Daroussin 
3598e903e7SBaptiste Daroussin stat  :  expr
3698e903e7SBaptiste Daroussin             {  printf("%d\n",$1);}
3798e903e7SBaptiste Daroussin       |  LETTER '=' expr
3898e903e7SBaptiste Daroussin             {  regs[$1] = $3; }
3998e903e7SBaptiste Daroussin       ;
4098e903e7SBaptiste Daroussin 
4198e903e7SBaptiste Daroussin expr  :  '(' expr ')'
4298e903e7SBaptiste Daroussin             {  $$ = $2; }
4398e903e7SBaptiste Daroussin       |  expr '+' expr
4498e903e7SBaptiste Daroussin             {  $$ = $1 + $3; }
4598e903e7SBaptiste Daroussin       |  expr '-' expr
4698e903e7SBaptiste Daroussin             {  $$ = $1 - $3; }
4798e903e7SBaptiste Daroussin       |  expr '*' expr
4898e903e7SBaptiste Daroussin             {  $$ = $1 * $3; }
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 %prec UMINUS
5898e903e7SBaptiste Daroussin             {  $$ = - $2; }
5998e903e7SBaptiste Daroussin       |  LETTER
6098e903e7SBaptiste Daroussin             {  $$ = regs[$1]; }
6198e903e7SBaptiste Daroussin       |  number
6298e903e7SBaptiste Daroussin       ;
6398e903e7SBaptiste Daroussin 
6498e903e7SBaptiste Daroussin number:  DIGIT
6598e903e7SBaptiste Daroussin          {  $$ = $1; base = ($1==0) ? 8 : 10; }
6698e903e7SBaptiste Daroussin       |  number DIGIT
6798e903e7SBaptiste Daroussin          {  $$ = base * $1 + $2; }
6898e903e7SBaptiste Daroussin       ;
6998e903e7SBaptiste Daroussin 
7098e903e7SBaptiste Daroussin %% /* start of programs */
7198e903e7SBaptiste Daroussin 
7298e903e7SBaptiste Daroussin #ifdef YYBYACC
7398e903e7SBaptiste Daroussin extern int YYLEX_DECL();
7498e903e7SBaptiste Daroussin #endif
7598e903e7SBaptiste Daroussin 
7698e903e7SBaptiste Daroussin int
main(void)7798e903e7SBaptiste Daroussin main (void)
7898e903e7SBaptiste Daroussin {
7998e903e7SBaptiste Daroussin     while(!feof(stdin)) {
8098e903e7SBaptiste Daroussin 	yyparse();
8198e903e7SBaptiste Daroussin     }
8298e903e7SBaptiste Daroussin     return 0;
8398e903e7SBaptiste Daroussin }
8498e903e7SBaptiste Daroussin 
8598e903e7SBaptiste Daroussin static void
yyerror(const char * s)8698e903e7SBaptiste Daroussin yyerror(const char *s)
8798e903e7SBaptiste Daroussin {
8898e903e7SBaptiste Daroussin     fprintf(stderr, "%s\n", s);
8998e903e7SBaptiste Daroussin }
9098e903e7SBaptiste Daroussin 
9198e903e7SBaptiste Daroussin int
yylex(void)9298e903e7SBaptiste Daroussin yylex(void)
9398e903e7SBaptiste Daroussin {
9498e903e7SBaptiste Daroussin 	/* lexical analysis routine */
9598e903e7SBaptiste Daroussin 	/* returns LETTER for a lower case letter, yylval = 0 through 25 */
9698e903e7SBaptiste Daroussin 	/* return DIGIT for a digit, yylval = 0 through 9 */
9798e903e7SBaptiste Daroussin 	/* all other characters are returned immediately */
9898e903e7SBaptiste Daroussin 
9998e903e7SBaptiste Daroussin     int c;
10098e903e7SBaptiste Daroussin 
10198e903e7SBaptiste Daroussin     while( (c=getchar()) == ' ' )   { /* skip blanks */ }
10298e903e7SBaptiste Daroussin 
10398e903e7SBaptiste Daroussin     /* c is now nonblank */
10498e903e7SBaptiste Daroussin 
10598e903e7SBaptiste Daroussin     if( islower( c )) {
10698e903e7SBaptiste Daroussin 	yylval = c - 'a';
10798e903e7SBaptiste Daroussin 	return ( LETTER );
10898e903e7SBaptiste Daroussin     }
10998e903e7SBaptiste Daroussin     if( isdigit( c )) {
11098e903e7SBaptiste Daroussin 	yylval = c - '0';
11198e903e7SBaptiste Daroussin 	return ( DIGIT );
11298e903e7SBaptiste Daroussin     }
11398e903e7SBaptiste Daroussin     return( c );
11498e903e7SBaptiste Daroussin }
115