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