1319297Sdelphij%token-table 2319297Sdelphij 3234949Sbapt%{ 4234949Sbapt# include <stdio.h> 5234949Sbapt# include <ctype.h> 6234949Sbapt 7234949Sbaptint regs[26]; 8234949Sbaptint base; 9234949Sbapt 10234949Sbapt#ifdef YYBISON 11234949Sbaptint yylex(void); 12234949Sbaptstatic void yyerror(const char *s); 13234949Sbapt#endif 14234949Sbapt 15234949Sbapt%} 16234949Sbapt 17234949Sbapt%start list 18234949Sbapt 19234949Sbapt%token DIGIT LETTER 20234949Sbapt 21234949Sbapt%left '|' 22234949Sbapt%left '&' 23234949Sbapt%left '+' '-' 24234949Sbapt%left '*' '/' '%' 25234949Sbapt%left UMINUS /* supplies precedence for unary minus */ 26234949Sbapt 27234949Sbapt%% /* beginning of rules section */ 28234949Sbapt 29234949Sbaptlist : /* empty */ 30234949Sbapt | list stat '\n' 31234949Sbapt | list error '\n' 32234949Sbapt { yyerrok ; } 33234949Sbapt ; 34234949Sbapt 35234949Sbaptstat : expr 36234949Sbapt { printf("%d\n",$1);} 37234949Sbapt | LETTER '=' expr 38234949Sbapt { regs[$1] = $3; } 39234949Sbapt ; 40234949Sbapt 41234949Sbaptexpr : '(' expr ')' 42234949Sbapt { $$ = $2; } 43234949Sbapt | expr '+' expr 44234949Sbapt { $$ = $1 + $3; } 45234949Sbapt | expr '-' expr 46234949Sbapt { $$ = $1 - $3; } 47234949Sbapt | expr '*' expr 48234949Sbapt { $$ = $1 * $3; } 49234949Sbapt | expr '/' expr 50234949Sbapt { $$ = $1 / $3; } 51234949Sbapt | expr '%' expr 52234949Sbapt { $$ = $1 % $3; } 53234949Sbapt | expr '&' expr 54234949Sbapt { $$ = $1 & $3; } 55234949Sbapt | expr '|' expr 56234949Sbapt { $$ = $1 | $3; } 57234949Sbapt | '-' expr %prec UMINUS 58234949Sbapt { $$ = - $2; } 59234949Sbapt | LETTER 60234949Sbapt { $$ = regs[$1]; } 61234949Sbapt | number 62234949Sbapt ; 63234949Sbapt 64234949Sbaptnumber: DIGIT 65234949Sbapt { $$ = $1; base = ($1==0) ? 8 : 10; } 66234949Sbapt | number DIGIT 67234949Sbapt { $$ = base * $1 + $2; } 68234949Sbapt ; 69234949Sbapt 70234949Sbapt%% /* start of programs */ 71234949Sbapt 72234949Sbapt#ifdef YYBYACC 73234949Sbaptextern int YYLEX_DECL(); 74234949Sbapt#endif 75234949Sbapt 76234949Sbaptint 77234949Sbaptmain (void) 78234949Sbapt{ 79234949Sbapt while(!feof(stdin)) { 80234949Sbapt yyparse(); 81234949Sbapt } 82234949Sbapt return 0; 83234949Sbapt} 84234949Sbapt 85234949Sbaptstatic void 86234949Sbaptyyerror(const char *s) 87234949Sbapt{ 88234949Sbapt fprintf(stderr, "%s\n", s); 89234949Sbapt} 90234949Sbapt 91234949Sbaptint 92234949Sbaptyylex(void) 93234949Sbapt{ 94234949Sbapt /* lexical analysis routine */ 95234949Sbapt /* returns LETTER for a lower case letter, yylval = 0 through 25 */ 96234949Sbapt /* return DIGIT for a digit, yylval = 0 through 9 */ 97234949Sbapt /* all other characters are returned immediately */ 98234949Sbapt 99234949Sbapt int c; 100234949Sbapt 101234949Sbapt while( (c=getchar()) == ' ' ) { /* skip blanks */ } 102234949Sbapt 103234949Sbapt /* c is now nonblank */ 104234949Sbapt 105234949Sbapt if( islower( c )) { 106234949Sbapt yylval = c - 'a'; 107234949Sbapt return ( LETTER ); 108234949Sbapt } 109234949Sbapt if( isdigit( c )) { 110234949Sbapt yylval = c - '0'; 111234949Sbapt return ( DIGIT ); 112234949Sbapt } 113234949Sbapt return( c ); 114234949Sbapt} 115