From 29c4382979b30996fd9c06e11f70e94089e4acee Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sat, 5 Sep 2020 02:55:16 -0700 Subject: [PATCH] update --- version3.0/nasal_enum.h | 52 +++--- version3.0/nasal_gc.h | 38 ++++- version3.0/nasal_parse.h | 19 ++- version3.0/nasal_runtime.h | 318 ++++++++++++++++++++++++++++++------- 4 files changed, 340 insertions(+), 87 deletions(-) diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index 21c1100..4eada5c 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -127,6 +127,8 @@ enum parse_error lack_args, default_arg_not_end, dynamic_id_not_end, + definition_use_call, + multi_id_use_call, multi_assign_lack_val, lack_definition, lack_loop_iter, @@ -140,31 +142,33 @@ void error_info(int line,int error_type,std::string error_str="") std::cout<=0) + nasal_vm.del_reference(closure_addr); argument_list.clear(); function_expr.clear(); return; @@ -492,27 +498,45 @@ int nasal_scalar::get_type() } double nasal_scalar::get_number() { - return *(double*)(this->scalar_ptr); + if(this->type==vm_number) + return *(double*)(this->scalar_ptr); + else + return 0; } std::string nasal_scalar::get_string() { - return *(std::string*)(this->scalar_ptr); + if(this->type==vm_string) + return *(std::string*)(this->scalar_ptr); + else + return "[vm] error value type"; } nasal_vector& nasal_scalar::get_vector() { - return *(nasal_vector*)(this->scalar_ptr); + if(this->type==vm_vector) + return *(nasal_vector*)(this->scalar_ptr); + else + return error_vector; } nasal_hash& nasal_scalar::get_hash() { - return *(nasal_hash*)(this->scalar_ptr); + if(this->type==vm_hash) + return *(nasal_hash*)(this->scalar_ptr); + else + return error_hash; } nasal_function& nasal_scalar::get_func() { - return *(nasal_function*)(this->scalar_ptr); + if(this->type==vm_function) + return *(nasal_function*)(this->scalar_ptr); + else + return error_function; } nasal_closure& nasal_scalar::get_closure() { - return *(nasal_closure*)(this->scalar_ptr); + if(this->type==vm_closure) + return *(nasal_closure*)(this->scalar_ptr); + else + return error_closure; } void nasal_scalar::deepcopy(nasal_scalar& tmp) { diff --git a/version3.0/nasal_parse.h b/version3.0/nasal_parse.h index 9ba4472..98119b1 100644 --- a/version3.0/nasal_parse.h +++ b/version3.0/nasal_parse.h @@ -989,7 +989,10 @@ nasal_ast nasal_parse::definition() if(ptr>=tok_list_size || tok_list[ptr].type!=tok_equal) { ++error; - error_info(error_line,lack_equal); + if(ptr=tok_list_size || tok_list[ptr].type!=tok_right_curve) + if(ptr=tok_list_size || tok_list[ptr].type!=tok_right_curve) { ++error; error_info(error_line,lack_right_curve); @@ -1045,7 +1053,12 @@ nasal_ast nasal_parse::var_outcurve_def() } node=multi_id(); ++ptr; - if(ptr>=tok_list_size || tok_list[ptr].type!=tok_right_curve) + if(ptr=tok_list_size || tok_list[ptr].type!=tok_right_curve) { ++error; error_info(error_line,lack_right_curve); diff --git a/version3.0/nasal_runtime.h b/version3.0/nasal_runtime.h index 4100b54..4f66dcd 100644 --- a/version3.0/nasal_runtime.h +++ b/version3.0/nasal_runtime.h @@ -56,9 +56,10 @@ private: int call_scalar_mem(nasal_ast&,int); int call_vector_mem(nasal_ast&,int,int); int call_hash_mem(nasal_ast&,int,int); - int call_function_mem(nasal_ast&,int,int); // calculate scalars int calculation(nasal_ast&,int); + void definition(nasal_ast&,int); + void multi_assignment(nasal_ast&,int); public: nasal_runtime(); ~nasal_runtime(); @@ -187,8 +188,12 @@ int nasal_runtime::main_progress() int node_type=root.get_children()[i].get_type(); switch(node_type) { - case ast_definition:break; - case ast_multi_assign:break; + case ast_definition: + definition(root.get_children()[i],-1); + break; + case ast_multi_assign: + multi_assignment(root.get_children()[i],-1); + break; case ast_conditional: ret_state=conditional_progress(root.get_children()[i],-1); break; @@ -266,8 +271,12 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr) int node_type=node.get_children()[i].get_type(); switch(node_type) { - case ast_definition:break; - case ast_multi_assign:break; + case ast_definition: + definition(node.get_children()[i],local_scope_addr); + break; + case ast_multi_assign: + multi_assignment(node.get_children()[i],local_scope_addr); + break; case ast_conditional: ret_state=conditional_progress(node.get_children()[i],local_scope_addr); break; @@ -340,6 +349,7 @@ int nasal_runtime::call_scalar(nasal_ast& node,int local_scope_addr) if(value_address<0) { std::cout<<">> [runtime] call_nasal_scalar: cannot find value named \'"<> [runtime] call_vector: incorrect value type,expected a vector/hash."< called_value_addrs; int call_size=node.get_children().size(); - nasal_vector& reference_value=nasal_vm.gc_get(base_value_addr).get_vector(); - for(int i=0;i called_value_addrs; + nasal_vector& reference_value=nasal_vm.gc_get(base_value_addr).get_vector(); + for(int i=0;i> [runtime] call_vector: begin index is not a number/numerable string."<> [runtime] call_vector: end index is not a number/numerable string."<> [runtime] call_vector: begin index is not a numerable string."<> [runtime] call_vector: end index is not a numerable string."<=end_index) + { + std::cout<<">> [runtime] call_vector: begin index must be less than end index."<> [runtime] call_vector: index is not a number/numerable string."<> [runtime] call_vector: index is not a numerable string."<1) + { + std::cout<<">> [runtime] call_vector: when calling a hash,only one key is alowed."<> [runtime] call_hash: incorrect value type,expected a hash."<> [runtime] call_nasal_mem: cannot find value named \'"<> [runtime] call_scalar_mem: cannot find value named \'"<> [runtime] call_scalar_mem: cannot change the value that function returns."<> [runtime] call_vector_mem: incorrect value type,expected a vector/hash."< called_mem_addrs; int call_size=node.get_children().size(); - nasal_vector& reference_value=nasal_vm.gc_get(base_value_addr).get_vector(); - for(int i=0;i1) { - if(node.get_children()[i].get_type()==ast_subvec) + std::cout<<">> [runtime] call_vector_mem: when searching a memory space in a vector,only one index is alowed."<> [runtime] call_vector_mem: sub-vector in this progress is a temporary value and cannot be changed."<> [runtime] call_vector_mem: index is not a number/numerable string."<> [runtime] call_vector_mem: index is not a numerable string."<1) + { + std::cout<<">> [runtime] call_vector_mem: when calling a hash,only one key is alowed."<> [runtime] call_hash_mem: incorrect value type,expected a hash."<> [runtime] call_function_mem: incorrect value type,expected a function."<