/* Thanks to: https://github.com/meyerd/flex-bison-example */ %{ #include #include extern int yylex(); extern int yyparse(); extern FILE* yyin; void yyerror(const char* s); int r; show_register() { printf("R: %i\n",r); } load_register(int value) { r = value; } clear_register(void) { r = 0; } store_register(int address) { printf("store %i at %x\n",r,address); } %} %union { int ival; float fval; } %token T_INT %token T_LOAD %token T_STORE %token T_CLEAR %token T_NEWLINE T_QUIT %type value %start assembler %% assembler: statement_list ; statement_list: | statement T_NEWLINE { show_register(); } statement_list ; statement: command | T_LOAD value { load_register($2); } | T_STORE value { store_register($2); } | T_CLEAR { clear_register(); } ; command: T_QUIT T_NEWLINE { printf("bye!\n"); exit(0); } ; value: T_INT { $$ = $1; } ; %% int main() { yyin = stdin; do { yyparse(); } while(!feof(yyin)); return 0; } void yyerror(const char* s) { fprintf(stderr, "Parse error: %s\n", s); exit(1); }