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