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