diff --git a/version3.0/nasal.h b/version3.0/nasal.h index 87ca069..3ed57c4 100644 --- a/version3.0/nasal.h +++ b/version3.0/nasal.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/version3.0/nasal_codegen.h b/version3.0/nasal_codegen.h index f69b26e..8c202b5 100644 --- a/version3.0/nasal_codegen.h +++ b/version3.0/nasal_codegen.h @@ -7,14 +7,16 @@ class nasal_codegen { private: - std::vector number_list; - std::vector string_list; - std::vector symbol_list; + std::vector file_header; + std::vector output_file; + std::vector string_table; int error; void init(); - void output_int(unsigned int,std::ofstream&); - void output_root(nasal_ast&,std::ofstream&); + void output_int(unsigned int,std::vector&); + void output_short(unsigned short,std::vector&); + void output_root(nasal_ast&); unsigned int input_int(std::ifstream&); + unsigned short input_short(std::ifstream&); void input_root(nasal_ast&,std::ifstream&); public: nasal_codegen(); @@ -26,9 +28,7 @@ public: nasal_codegen::nasal_codegen() { error=0; - number_list.clear(); - string_list.clear(); - symbol_list.clear(); + string_table.clear(); return; } @@ -40,49 +40,86 @@ int nasal_codegen::get_error() void nasal_codegen::init() { error=0; - number_list.clear(); - string_list.clear(); - symbol_list.clear(); + string_table.clear(); + file_header.clear(); + output_file.clear(); return; } -void nasal_codegen::output_int(unsigned int num,std::ofstream& fout) +void nasal_codegen::output_int(unsigned int num,std::vector& vec) { - unsigned int get_byte=0xff000000; - int offset=24; + unsigned int tmp=0xff000000; + unsigned int offset=24; for(int i=0;i<4;++i) { - fout<<(unsigned char)((get_byte&num)>>offset); - get_byte>>=8; + vec.push_back((unsigned char)((tmp&num)>>offset)); offset-=8; + tmp>>=8; } return; } -void nasal_codegen::output_root(nasal_ast& root,std::ofstream& fout) +void nasal_codegen::output_short(unsigned short num,std::vector& vec) { - output_int(ast_begin,fout); - unsigned int type=root.get_type(); - output_int(type,fout); + vec.push_back((unsigned char)((num&0xff00)>>8)); + vec.push_back((unsigned char)(num&0x00ff)); + return; +} + +void nasal_codegen::output_root(nasal_ast& root) +{ + unsigned char type=(unsigned char)root.get_type(); + output_file.push_back(type); std::vector& ref_vec=root.get_children(); - int root_children_size=ref_vec.size(); - output_int(root_children_size,fout); + unsigned short root_children_size=ref_vec.size(); + output_short(root_children_size,output_file); if(type==ast_number || type==ast_string || type==ast_identifier || type==ast_dynamic_id || type==ast_call_hash) { std::string tmp=root.get_str(); - for(int i=0;iinit(); + + // put header input file_header + unsigned char header[4]={0x40,0x56,0x4b,0x21}; + for(int i=0;i<4;++i) + file_header.push_back(header[i]); + + // main progress,put codes into output_file + output_root(root); + + // put string table into file_header + output_short(string_table.size(),file_header); + for(int i=0;i> [code] file format error: without ast_begin."<> [code] file format error: without ast_end."<> [code] \""<& ref_vec=add_root.get_children(); int size=ref_vec.size(); for(int i=0;i