%{ #include #include "symtable.h" void emit(char*, char*); %} %union { int value; int index; char relop; } %token NUMBER %token ID %token RELOP %token ASSIGN %token IF THEN ENDIF %left RELOP %left '-' '+' %left '*' '/' %type expr %% program : stmt_list ; stmt_list : stmt_list ';' stmt | stmt ; stmt : ID {emit("lvalue", get_id($1));} ASSIGN expr {emit(":=", ""); } | IF expr THEN stmt_list ENDIF ; expr : expr '+' expr { emit("add", ""); } | expr '-' expr { emit("sub", ""); } | expr '*' expr { emit("mul", ""); } | expr '/' expr { emit("div", ""); } | expr RELOP expr { if($2 == '=') emit("eq", ""); else if($2 == '<') emit("lt", ""); else if($2 == '>') emit("gt", ""); } | '(' expr ')' {} | NUMBER { emit_i("push", $1); } | ID { emit("rvalue", get_id($1)); } ; %% yyerror(char* errmsg) { extern char* yytext; fprintf(stderr, "%s (%s)\n", errmsg, yytext); } void emit(char* opcode, char* operand) { printf("> %s %s\n", opcode, operand); } void emit_i(char* opcode, int operand) { printf("> %s %d\n", opcode, operand); } main(int argc, char** argv) { initlex(); yyparse(); return 0; }