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