10c8de5b0SBaptiste Daroussin %pure_parser 20c8de5b0SBaptiste Daroussin 30c8de5b0SBaptiste Daroussin %parse_param { int regs[26] } 40c8de5b0SBaptiste Daroussin %parse_param { int *base } 50c8de5b0SBaptiste Daroussin 60c8de5b0SBaptiste Daroussin %lex_param { int *base } 70c8de5b0SBaptiste Daroussin 80c8de5b0SBaptiste Daroussin %{ 90c8de5b0SBaptiste Daroussin # include <stdio.h> 100c8de5b0SBaptiste Daroussin # include <ctype.h> 110c8de5b0SBaptiste Daroussin 120c8de5b0SBaptiste Daroussin #ifdef YYBISON 130c8de5b0SBaptiste Daroussin #define YYSTYPE int 140c8de5b0SBaptiste Daroussin #define YYLEX_PARAM base 150c8de5b0SBaptiste Daroussin #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM) 160c8de5b0SBaptiste Daroussin #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s) 170c8de5b0SBaptiste Daroussin int YYLEX_DECL(); 180c8de5b0SBaptiste Daroussin static void YYERROR_DECL(); 190c8de5b0SBaptiste Daroussin #endif 200c8de5b0SBaptiste Daroussin 210c8de5b0SBaptiste Daroussin %} 220c8de5b0SBaptiste Daroussin 230c8de5b0SBaptiste Daroussin %start list 240c8de5b0SBaptiste Daroussin 250c8de5b0SBaptiste Daroussin %token DIGIT LETTER 260c8de5b0SBaptiste Daroussin 270c8de5b0SBaptiste Daroussin %token OCT1 '\177' 280c8de5b0SBaptiste Daroussin %token HEX1 '\xff' 290c8de5b0SBaptiste Daroussin %token HEX2 '\xFF' 300c8de5b0SBaptiste Daroussin %token HEX3 '\x7f' 310c8de5b0SBaptiste Daroussin %token STR1 "\x7f\177\\\n" 320c8de5b0SBaptiste Daroussin %token STR2 "\x7f\ 330c8de5b0SBaptiste Daroussin \177\\\n" 340c8de5b0SBaptiste Daroussin 350c8de5b0SBaptiste Daroussin %token BELL '\a' 360c8de5b0SBaptiste Daroussin %token BS '\b' 370c8de5b0SBaptiste Daroussin %token NL '\n' 380c8de5b0SBaptiste Daroussin %token LF '\f' 390c8de5b0SBaptiste Daroussin %token CR '\r' 400c8de5b0SBaptiste Daroussin %token TAB '\t' 410c8de5b0SBaptiste Daroussin %token VT '\v' 420c8de5b0SBaptiste Daroussin 43*822ca327SBaptiste Daroussin %union CalcData 440c8de5b0SBaptiste Daroussin { 450c8de5b0SBaptiste Daroussin char * cval; 460c8de5b0SBaptiste Daroussin int ival; 470c8de5b0SBaptiste Daroussin double dval; 480c8de5b0SBaptiste Daroussin } 490c8de5b0SBaptiste Daroussin 500c8de5b0SBaptiste Daroussin %0 '@' 510c8de5b0SBaptiste Daroussin %2 '~' 520c8de5b0SBaptiste Daroussin %> '^' 530c8de5b0SBaptiste Daroussin %< '#' 540c8de5b0SBaptiste Daroussin 550c8de5b0SBaptiste Daroussin %left '|' 560c8de5b0SBaptiste Daroussin %left '&' 570c8de5b0SBaptiste Daroussin %left '+' '-' 580c8de5b0SBaptiste Daroussin %left '*' '/' '%' 590c8de5b0SBaptiste Daroussin %left UMINUS /* supplies precedence for unary minus */ 600c8de5b0SBaptiste Daroussin 610c8de5b0SBaptiste Daroussin %% /* beginning of rules section */ 620c8de5b0SBaptiste Daroussin 630c8de5b0SBaptiste Daroussin list : /* empty */ 640c8de5b0SBaptiste Daroussin | list stat '\n' 650c8de5b0SBaptiste Daroussin | list error '\n' 660c8de5b0SBaptiste Daroussin { yyerrok ; } 670c8de5b0SBaptiste Daroussin ; 680c8de5b0SBaptiste Daroussin 690c8de5b0SBaptiste Daroussin stat : expr 700c8de5b0SBaptiste Daroussin { printf("%d\n",$<ival>1);} 710c8de5b0SBaptiste Daroussin | LETTER '=' expr 720c8de5b0SBaptiste Daroussin { regs[$<ival>1] = $<ival>3; } 730c8de5b0SBaptiste Daroussin ; 740c8de5b0SBaptiste Daroussin 750c8de5b0SBaptiste Daroussin expr : '(' expr ')' 760c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>2; } 770c8de5b0SBaptiste Daroussin | expr '+' expr 780c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 + $<ival>3; } 790c8de5b0SBaptiste Daroussin | expr '-' expr 800c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 - $<ival>3; } 810c8de5b0SBaptiste Daroussin | expr '*' expr 820c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 * $<ival>3; } 830c8de5b0SBaptiste Daroussin | expr '/' expr 840c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 / $<ival>3; } 850c8de5b0SBaptiste Daroussin | expr '%' expr 860c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 % $<ival>3; } 870c8de5b0SBaptiste Daroussin | expr '&' expr 880c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 & $<ival>3; } 890c8de5b0SBaptiste Daroussin | expr '|' expr 900c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1 | $<ival>3; } 910c8de5b0SBaptiste Daroussin | '-' expr %prec UMINUS 920c8de5b0SBaptiste Daroussin { $<ival>$ = - $<ival>2; } 930c8de5b0SBaptiste Daroussin | LETTER 940c8de5b0SBaptiste Daroussin { $<ival>$ = regs[$<ival>1]; } 950c8de5b0SBaptiste Daroussin | number 960c8de5b0SBaptiste Daroussin ; 970c8de5b0SBaptiste Daroussin 980c8de5b0SBaptiste Daroussin number: DIGIT 990c8de5b0SBaptiste Daroussin { $<ival>$ = $<ival>1; (*base) = ($<ival>1==0) ? 8 : 10; } 1000c8de5b0SBaptiste Daroussin | number DIGIT 1010c8de5b0SBaptiste Daroussin { $<ival>$ = (*base) * $<ival>1 + $<ival>2; } 1020c8de5b0SBaptiste Daroussin ; 1030c8de5b0SBaptiste Daroussin 1040c8de5b0SBaptiste Daroussin %% /* start of programs */ 1050c8de5b0SBaptiste Daroussin 1060c8de5b0SBaptiste Daroussin #ifdef YYBYACC 1070c8de5b0SBaptiste Daroussin extern int YYLEX_DECL(); 1080c8de5b0SBaptiste Daroussin #endif 1090c8de5b0SBaptiste Daroussin 1100c8de5b0SBaptiste Daroussin int 1110c8de5b0SBaptiste Daroussin main (void) 1120c8de5b0SBaptiste Daroussin { 1130c8de5b0SBaptiste Daroussin int regs[26]; 1140c8de5b0SBaptiste Daroussin int base = 10; 1150c8de5b0SBaptiste Daroussin 1160c8de5b0SBaptiste Daroussin while(!feof(stdin)) { 1170c8de5b0SBaptiste Daroussin yyparse(regs, &base); 1180c8de5b0SBaptiste Daroussin } 1190c8de5b0SBaptiste Daroussin return 0; 1200c8de5b0SBaptiste Daroussin } 1210c8de5b0SBaptiste Daroussin 1220c8de5b0SBaptiste Daroussin #define UNUSED(x) ((void)(x)) 1230c8de5b0SBaptiste Daroussin 1240c8de5b0SBaptiste Daroussin static void 1250c8de5b0SBaptiste Daroussin YYERROR_DECL() 1260c8de5b0SBaptiste Daroussin { 1270c8de5b0SBaptiste Daroussin UNUSED(regs); /* %parse-param regs is not actually used here */ 1280c8de5b0SBaptiste Daroussin UNUSED(base); /* %parse-param base is not actually used here */ 1290c8de5b0SBaptiste Daroussin fprintf(stderr, "%s\n", s); 1300c8de5b0SBaptiste Daroussin } 1310c8de5b0SBaptiste Daroussin 1320c8de5b0SBaptiste Daroussin int 1330c8de5b0SBaptiste Daroussin YYLEX_DECL() 1340c8de5b0SBaptiste Daroussin { 1350c8de5b0SBaptiste Daroussin /* lexical analysis routine */ 1360c8de5b0SBaptiste Daroussin /* returns LETTER for a lower case letter, yylval = 0 through 25 */ 1370c8de5b0SBaptiste Daroussin /* return DIGIT for a digit, yylval = 0 through 9 */ 1380c8de5b0SBaptiste Daroussin /* all other characters are returned immediately */ 1390c8de5b0SBaptiste Daroussin 1400c8de5b0SBaptiste Daroussin int c; 1410c8de5b0SBaptiste Daroussin 1420c8de5b0SBaptiste Daroussin while( (c=getchar()) == ' ' ) { /* skip blanks */ } 1430c8de5b0SBaptiste Daroussin 1440c8de5b0SBaptiste Daroussin /* c is now nonblank */ 1450c8de5b0SBaptiste Daroussin 1460c8de5b0SBaptiste Daroussin if( islower( c )) { 1470c8de5b0SBaptiste Daroussin yylval->ival = (c - 'a'); 1480c8de5b0SBaptiste Daroussin return ( LETTER ); 1490c8de5b0SBaptiste Daroussin } 1500c8de5b0SBaptiste Daroussin if( isdigit( c )) { 1510c8de5b0SBaptiste Daroussin yylval->ival = (c - '0') % (*base); 1520c8de5b0SBaptiste Daroussin return ( DIGIT ); 1530c8de5b0SBaptiste Daroussin } 1540c8de5b0SBaptiste Daroussin return( c ); 1550c8de5b0SBaptiste Daroussin } 156