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