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