%{ #include #include #include #include void apply(char); void load_num(char); void load_var(char); void store_var(char); int yyerror(char *); int yylex(); int reg_count=0; struct instruction { char op1; char op2; char opr; }; %} %token IDENT NUM %type expr %left '+' %left '*''/' %left '-' %% statement: IDENT '=' expr ';' { store_var((char)$1); } ; expr: expr '+' expr {apply('+');} | expr '-' expr {apply('-');} | expr '*' expr {apply('*');} | NUM {load_num((char)$1); $$=(char)$1;} | IDENT {load_var((char)$1); $$=(char)$1;} ; %% void apply(char opr) { switch(opr) { case '+': printf("ADD "); break; case '-': printf("SUB "); break; case '*': printf("MUL "); } printf("R%d, R%d, R%d\n", reg_count-2, reg_count-2, reg_count-1); } void load_num(char num) { printf("LD R%d, #%c\n", reg_count++, num); } void load_var(char var) { printf("LD R%d, %c\n", reg_count++, var); } void store_var(char var) { printf("ST %c, R%d\n", var, reg_count-1); } int yyerror(char *s) { printf("ERROR: %s",s); exit(0); } int main() { yyparse(); }