From 944f713ee92cf89f9615012a9f97bda844cafe63 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sat, 13 Feb 2021 11:09:31 +0800 Subject: [PATCH] update --- main.cpp | 4 +-- nasal_codegen.h | 94 ++++++++++++++++++++++++------------------------- nasal_import.h | 2 +- nasal_parse.h | 72 ++++++++++++++++++++++++------------- 4 files changed, 97 insertions(+), 75 deletions(-) diff --git a/main.cpp b/main.cpp index 42deb9c..db16a2e 100644 --- a/main.cpp +++ b/main.cpp @@ -5,7 +5,7 @@ nasal_parse parse; nasal_import import; std::string inputfile="null"; nasal_codegen code_generator; -nasal_vm bytevm; +nasal_vm vm; void help() { @@ -120,7 +120,7 @@ void execute() return; } code_generator.main_progress(import.get_root()); - bytevm.run( + vm.run( code_generator.get_string_table(), code_generator.get_number_table(), code_generator.get_exec_code() diff --git a/nasal_codegen.h b/nasal_codegen.h index 87742e2..523b28e 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -128,11 +128,11 @@ struct opcode class nasal_codegen { private: - std::map number_table; - std::map string_table; - std::vector number_result_table; - std::vector string_result_table; - std::vector exec_code; + std::map number_table; + std::map string_table; + std::vector number_result_table; + std::vector string_result_table; + std::vector exec_code; std::list > continue_ptr; std::list > break_ptr; int error; @@ -323,9 +323,9 @@ void nasal_codegen::call_gen(nasal_ast& ast) nasal_ast& tmp=ast.get_children()[i]; switch(tmp.get_type()) { - case ast_call_hash:call_hash(tmp);break; - case ast_call_vec: call_vec(tmp); break; - case ast_call_func:call_func(tmp);break; + case ast_callh:call_hash(tmp);break; + case ast_callv: call_vec(tmp); break; + case ast_callf:call_func(tmp);break; } } return; @@ -404,9 +404,9 @@ void nasal_codegen::mem_call(nasal_ast& ast) for(int i=1;i=tok_list_size || tok_list[ptr].type!=type) + { + std::string s=""; + for(int i=0;token_table[i].str;++i) + if(token_table[i].tok_type==type) + { + s=token_table[i].str; + break; + } + if(type==tok_num) + die(error_line,"expect a number"); + else if(type==tok_str) + die(error_line,"expect a string"); + else if(type==tok_id) + die(error_line,"expect an identifier"); + else + die(error_line,"expect \'"+s+"\'"); + } + ++ptr; + return; +} + bool nasal_parse::check_multi_def() { return ptr+11 || tmp.get_children()[0].get_type()==ast_subvec)) + if(tmp.get_type()==ast_callv && (tmp.get_children().size()>1 || tmp.get_children()[0].get_type()==ast_subvec)) die(tmp.get_line(),"cannot get the memory in temporary sliced vector"); } } @@ -305,7 +330,7 @@ nasal_ast nasal_parse::id_gen() nasal_ast nasal_parse::vec_gen() { nasal_ast node(tok_list[ptr].line,ast_vec); - ++ptr; + match(tok_lbracket); while(ptr=tok_list_size || tok_list[ptr].type!=tok_colon) - { - die(error_line,"expected \":\""); - return node; - } ++ptr; + match(tok_colon); node.add_child(calc()); return node; } nasal_ast nasal_parse::func_gen() { nasal_ast node(tok_list[ptr].line,ast_func); - if(++ptr>=tok_list_size) + match(tok_func); + if(ptr>=tok_list_size) { die(error_line,"expected argument(s)/expression block"); return node; @@ -561,7 +583,7 @@ nasal_ast nasal_parse::calc() if(ptr