%{ #include #include int regs[26]; int base; %} %start list %token DIGIT LETTER /* do without precedence */ %% /* beginning of rules section */ list : /* empty */ | list stat ';' | list stat '\n' | list '\n' | list error '\n' { yyerrok; } ; stat : expr { printf( "%d\n",$1); } | LETTER '=' expr { regs[$1] = $3; } ; expr : expr '+' fctr { $$ = $1 + $3; } | expr '-' fctr { $$ = $1 - $3; } | fctr ; fctr : fctr '*' uexp { $$ = $1 * $3; } | fctr '/' uexp { $$ = $1 / $3; } | uexp ; uexp : '-' term { $$ = - $2; } | term ; term : '(' expr ')' { $$ = $2; } | LETTER { $$ = regs[$1]; } | number ; number : DIGIT { $$ = $1; base = ($1==0) ? 8 : 10; } | number DIGIT { $$ = base * $1 + $2; } ; %% /* start of program */ yylex(){ int c; while((c=getchar()) == ' ') {/* skip blanks */}; /* printf("read c= %c \n",c); */ if(islower(c)){ yylval=c-'a'; return (LETTER) ; } if(isdigit(c)){ yylval=c-'0'; return (DIGIT) ; } return (c); }