198e903e7SBaptiste Daroussin %pure-parser 298e903e7SBaptiste Daroussin 398e903e7SBaptiste Daroussin %parse-param { int regs[26] } 498e903e7SBaptiste Daroussin %parse-param { int *base } 598e903e7SBaptiste Daroussin 698e903e7SBaptiste Daroussin %lex-param { int *base } 798e903e7SBaptiste Daroussin 898e903e7SBaptiste Daroussin %{ 998e903e7SBaptiste Daroussin # include <stdio.h> 1098e903e7SBaptiste Daroussin # include <ctype.h> 1198e903e7SBaptiste Daroussin 1298e903e7SBaptiste Daroussin #ifdef YYBISON 1398e903e7SBaptiste Daroussin #define YYSTYPE int 1498e903e7SBaptiste Daroussin #define YYLEX_PARAM base 1598e903e7SBaptiste Daroussin #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) 1698e903e7SBaptiste Daroussin #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) 1798e903e7SBaptiste Daroussin int YYLEX_DECL(); 1898e903e7SBaptiste Daroussin static void YYERROR_DECL(); 1998e903e7SBaptiste Daroussin #endif 2098e903e7SBaptiste Daroussin 2198e903e7SBaptiste Daroussin %} 2298e903e7SBaptiste Daroussin 2398e903e7SBaptiste Daroussin %start list 2498e903e7SBaptiste Daroussin 2598e903e7SBaptiste Daroussin %token DIGIT LETTER 2698e903e7SBaptiste Daroussin 2798e903e7SBaptiste Daroussin %left '|' 2898e903e7SBaptiste Daroussin %left '&' 2998e903e7SBaptiste Daroussin %left '+' '-' 3098e903e7SBaptiste Daroussin %left '*' '/' '%' 3198e903e7SBaptiste Daroussin %left UMINUS /* supplies precedence for unary minus */ 3298e903e7SBaptiste Daroussin 3398e903e7SBaptiste Daroussin %% /* beginning of rules section */ 3498e903e7SBaptiste Daroussin 3598e903e7SBaptiste Daroussin list : /* empty */ 3698e903e7SBaptiste Daroussin | list stat '\n' 3798e903e7SBaptiste Daroussin | list error '\n' 3898e903e7SBaptiste Daroussin { yyerrok ; } 3998e903e7SBaptiste Daroussin ; 4098e903e7SBaptiste Daroussin 4198e903e7SBaptiste Daroussin stat : expr 4298e903e7SBaptiste Daroussin { printf("%d\n",$1);} 4398e903e7SBaptiste Daroussin | LETTER '=' expr 4498e903e7SBaptiste Daroussin { regs[$1] = $3; } 4598e903e7SBaptiste Daroussin ; 4698e903e7SBaptiste Daroussin 4798e903e7SBaptiste Daroussin expr : '(' expr ')' 4898e903e7SBaptiste Daroussin { $$ = $2; } 4998e903e7SBaptiste Daroussin | expr '+' expr 5098e903e7SBaptiste Daroussin { $$ = $1 + $3; } 5198e903e7SBaptiste Daroussin | expr '-' expr 5298e903e7SBaptiste Daroussin { $$ = $1 - $3; } 5398e903e7SBaptiste Daroussin | expr '*' expr 5498e903e7SBaptiste Daroussin { $$ = $1 * $3; } 5598e903e7SBaptiste Daroussin | expr '/' expr 5698e903e7SBaptiste Daroussin { $$ = $1 / $3; } 5798e903e7SBaptiste Daroussin | expr '%' expr 5898e903e7SBaptiste Daroussin { $$ = $1 % $3; } 5998e903e7SBaptiste Daroussin | expr '&' expr 6098e903e7SBaptiste Daroussin { $$ = $1 & $3; } 6198e903e7SBaptiste Daroussin | expr '|' expr 6298e903e7SBaptiste Daroussin { $$ = $1 | $3; } 6398e903e7SBaptiste Daroussin | '-' expr %prec UMINUS 6498e903e7SBaptiste Daroussin { $$ = - $2; } 6598e903e7SBaptiste Daroussin | LETTER 6698e903e7SBaptiste Daroussin { $$ = regs[$1]; } 6798e903e7SBaptiste Daroussin | number 6898e903e7SBaptiste Daroussin ; 6998e903e7SBaptiste Daroussin 7098e903e7SBaptiste Daroussin number: DIGIT 7198e903e7SBaptiste Daroussin { $$ = $1; (*base) = ($1==0) ? 8 : 10; } 7298e903e7SBaptiste Daroussin | number DIGIT 7398e903e7SBaptiste Daroussin { $$ = (*base) * $1 + $2; } 7498e903e7SBaptiste Daroussin ; 7598e903e7SBaptiste Daroussin 7698e903e7SBaptiste Daroussin %% /* start of programs */ 7798e903e7SBaptiste Daroussin 7898e903e7SBaptiste Daroussin #ifdef YYBYACC 7998e903e7SBaptiste Daroussin extern int YYLEX_DECL(); 8098e903e7SBaptiste Daroussin #endif 8198e903e7SBaptiste Daroussin 8298e903e7SBaptiste Daroussin int main(void)8398e903e7SBaptiste Daroussinmain (void) 8498e903e7SBaptiste Daroussin { 8598e903e7SBaptiste Daroussin int regs[26]; 8698e903e7SBaptiste Daroussin int base = 10; 8798e903e7SBaptiste Daroussin 8898e903e7SBaptiste Daroussin while(!feof(stdin)) { 8998e903e7SBaptiste Daroussin yyparse(regs, &base); 9098e903e7SBaptiste Daroussin } 9198e903e7SBaptiste Daroussin return 0; 9298e903e7SBaptiste Daroussin } 9398e903e7SBaptiste Daroussin 94*0c8de5b0SBaptiste Daroussin #define UNUSED(x) ((void)(x)) 95*0c8de5b0SBaptiste Daroussin 9698e903e7SBaptiste Daroussin static void YYERROR_DECL()9798e903e7SBaptiste DaroussinYYERROR_DECL() 9898e903e7SBaptiste 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 */ 10198e903e7SBaptiste Daroussin fprintf(stderr, "%s\n", s); 10298e903e7SBaptiste Daroussin } 10398e903e7SBaptiste Daroussin 10498e903e7SBaptiste Daroussin int YYLEX_DECL()10598e903e7SBaptiste DaroussinYYLEX_DECL() 10698e903e7SBaptiste Daroussin { 10798e903e7SBaptiste Daroussin /* lexical analysis routine */ 10898e903e7SBaptiste Daroussin /* returns LETTER for a lower case letter, yylval = 0 through 25 */ 10998e903e7SBaptiste Daroussin /* return DIGIT for a digit, yylval = 0 through 9 */ 11098e903e7SBaptiste Daroussin /* all other characters are returned immediately */ 11198e903e7SBaptiste Daroussin 11298e903e7SBaptiste Daroussin int c; 11398e903e7SBaptiste Daroussin 11498e903e7SBaptiste Daroussin while( (c=getchar()) == ' ' ) { /* skip blanks */ } 11598e903e7SBaptiste Daroussin 11698e903e7SBaptiste Daroussin /* c is now nonblank */ 11798e903e7SBaptiste Daroussin 11898e903e7SBaptiste Daroussin if( islower( c )) { 11998e903e7SBaptiste Daroussin *yylval = (c - 'a'); 12098e903e7SBaptiste Daroussin return ( LETTER ); 12198e903e7SBaptiste Daroussin } 12298e903e7SBaptiste Daroussin if( isdigit( c )) { 12398e903e7SBaptiste Daroussin *yylval = (c - '0') % (*base); 12498e903e7SBaptiste Daroussin return ( DIGIT ); 12598e903e7SBaptiste Daroussin } 12698e903e7SBaptiste Daroussin return( c ); 12798e903e7SBaptiste Daroussin } 128