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