diff --git a/version3.0/nasal_enum.h b/version3.0/nasal_enum.h index 4eada5c..9adcc23 100644 --- a/version3.0/nasal_enum.h +++ b/version3.0/nasal_enum.h @@ -127,6 +127,7 @@ enum parse_error lack_args, default_arg_not_end, dynamic_id_not_end, + name_repetition, definition_use_call, multi_id_use_call, multi_assign_lack_val, @@ -137,9 +138,9 @@ enum parse_error void error_info(int line,int error_type,std::string error_str="") { - std::string info=">> [parse] error: line "; + std::string info=">> [parse] error_info: [line "; std::string detail; - std::cout< argname_table; + for(int i=0;i> [runtime] return expression is not allowed here."<> [runtime] call_nasal_scalar: cannot find value named \'"<> [runtime] call_function: lack at least "< args_usage_table; // check arguments in argument_format is correctly used + std::map default_args_table; // check default arguments + std::map default_args_node; // if one of default arguments is not in use,use default value + // load arguments' name. + int arg_format_size=argument_format.get_children().size(); + for(int i=0;i> [runtime] call_function: identifier named \'"<::iterator i=default_args_table.begin();i!=default_args_table.end();++i) + if(!i->second) + { + int value_addr=calculation(*default_args_node[i->first],local_scope_addr); + if(value_addr<0) + return -1; + run_closure.add_new_value(i->first,value_addr); + args_usage_table[i->first]=true; + } + // use null vector if dynamic-identifier haven't been initialized. + if(argument_format.get_children().back().get_type()==ast_dynamic_id) + { + std::string dyn_str=argument_format.get_children().back().get_str(); + if(!args_usage_table[dyn_str]) + { + args_usage_table[dyn_str]=true; + int vector_value_addr=nasal_vm.gc_alloc(); + nasal_vm.gc_get(vector_value_addr).set_type(vm_vector); + run_closure.add_new_value(dyn_str,vector_value_addr); + } + } + // check if each argument is initialized. + for(std::map::iterator i=args_usage_table.begin();i!=args_usage_table.end();++i) + if(!i->second) + { + std::cout<<">> [runtime] call_function: argument named \'"<first<<"\' is not in use."< args; // store value address of input arguments + int size=node.get_children().size(); + for(int i=0;i> [runtime] call_function: error value address when generating argument list."<arg_format_size && argument_format.get_children().back().get_type()!=ast_dynamic_id) + { + std::cout<<">> [runtime] call_function: too much arguments."<> [runtime] call_function: lack argument(s).stop."<=0) + { + ret_value_addr=function_returned_address; + function_returned_address=-1; + } + else + { + ret_value_addr=nasal_vm.gc_alloc(); + nasal_vm.gc_get(ret_value_addr).set_type(vm_nil); + } return ret_value_addr; } int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr) @@ -1061,10 +1227,12 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr) } void nasal_runtime::definition(nasal_ast& node,int local_scope_addr) { + // unfinished return; } void nasal_runtime::multi_assignment(nasal_ast& node,int local_scope_addr) { + //unfinished return; }