#include #include "icode.h" #include "lt.h" #include "nt.h" #include "parser.h" static void print_string_const(const char *str); void ICommand::print() const { char line[32]; if (label != 0) printf("%s ", Label(label).toString(line, 32)); switch (type) { case int_const: printf("int_const %d", int_value); break; case double_const: printf("double_const %lf", double_value); break; case string_const: //... printf("string_const \"%s\"", string_value.c_str()); printf("string_const \""); print_string_const(string_value.c_str()); printf("\""); break; case assign: printf("assign"); break; case assign_local: printf("assign_local"); break; case assign_ref: printf("assign_ref"); break; case ret: printf("ret"); break; case name: printf("name %s", string_value.c_str()); break; case def_global: printf( "def_global %s", string_value.c_str() ); break; case empty_array: printf("empty_array"); break; case array_append: printf("array_append"); break; case array_element: printf("array_element"); break; case function_def: printf("function_def %s", string_value.c_str()); break; case function_call: printf("function_call %s", string_value.c_str()); break; case function_entry: printf("function_entry %s", string_value.c_str()); break; case function_exit: printf("function_exit"); break; case plus: printf("plus"); break; case minus: printf("minus"); break; case mul: printf("mul"); break; case div: printf("div"); break; case mod: printf("mod"); break; case power: printf("power"); break; case uminus: printf("uminus"); break; case typecast: printf("typecast to "); if (int_value == TYPE_INT) printf("int"); else if (int_value == TYPE_DOUBLE) printf("double"); else if (int_value == TYPE_STRING) printf("string"); else assert(false); break; case cmp: printf("cmp"); break; case go_to: printf( "goto %s", Label(goto_label).toString(line, 32) ); break; case if_goto: printf("if_goto "); switch (ext) { case eq: printf("eq "); break; case ne: printf("ne "); break; case gt: printf("gt "); break; case ge: printf("ge "); break; case lt: printf("lt "); break; case le: printf("le "); break; default: printf("illegal condition "); } printf("%s", Label(goto_label).toString(line, 32)); break; case if_throw: printf("if_throw "); switch (ext) { case eq: printf("eq "); break; case ne: printf("ne "); break; case gt: printf("gt "); break; case ge: printf("ge "); break; case lt: printf("lt "); break; case le: printf("le "); break; default: printf("illegal condition "); } printf("%s", string_value.c_str()); break; case input: printf("input"); break; case output: printf("output"); break; case pop: printf("pop"); break; case exch: printf("exch"); break; case nop: printf("nop"); break; default: printf("Illegal command"); } printf("\n"); } IProgram::iterator IProgram::addNewCommand() { push_back(ICommand()); IProgram::iterator i = end(); --i; i->line_number = yylineno; // Store the source line number return i; } void IProgram::print() const { IProgram::const_iterator i = begin(); while (i != end()) { i->print(); ++i; } } static void print_string_const(const char *str) { const char *p = str; if (p == NULL) { printf("NULL"); return; } char c; while ((c = *p) != 0) { switch(c) { case '\n': printf("\\n"); break; case '\r': printf("\\r"); break; case '\t': printf("\\r"); break; default: printf("%c", c); break; } ++p; } }