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