This commit is contained in:
Valk Richard Li 2020-10-19 08:42:44 -07:00 committed by GitHub
parent e2a50a61e6
commit 5cd487a158
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 110 additions and 101 deletions

View File

@ -35,13 +35,12 @@ enum ast_node
ast_conditional,ast_if,ast_elsif,ast_else, ast_conditional,ast_if,ast_elsif,ast_else,
ast_multi_id,ast_multi_scalar, ast_multi_id,ast_multi_scalar,
ast_definition,ast_multi_assign, ast_definition,ast_multi_assign,
ast_continue,ast_break,ast_return, ast_continue,ast_break,ast_return
ast_begin,ast_end // reserved for code generator
}; };
std::string ast_str(int type) std::string ast_str(int type)
{ {
std::string str=""; std::string str;
switch(type) switch(type)
{ {
case ast_null: str="null";break; case ast_null: str="null";break;
@ -109,6 +108,7 @@ enum parse_error
{ {
unknown, unknown,
error_token, error_token,
error_expr,
lack_left_curve, lack_left_curve,
lack_right_curve, lack_right_curve,
lack_left_bracket, lack_left_bracket,
@ -139,41 +139,40 @@ enum parse_error
void error_info(int line,int error_type,std::string error_str="") void error_info(int line,int error_type,std::string error_str="")
{ {
std::string info=">> [parse] error_info: [line ";
std::string detail; std::string detail;
std::cout<<info<<line<<"] "; std::cout<<">> [parse] error_info: [line "<<line<<"] ";
switch(error_type) switch(error_type)
{ {
case unknown: detail="unknown error."; break; case unknown: std::cout<<"unknown error.\n"; break;
case error_token: detail="error token \'"+error_str+"\'"; break; case error_token: std::cout<<"error token \""+error_str+"\".\n"; break;
case lack_left_curve: detail="expected \'(\'."; break; case error_expr: std::cout<<"error expression \""+error_str+"\".\n"; break;
case lack_right_curve: detail="expected \')\'."; break; case lack_left_curve: std::cout<<"expected \"(\".\n"; break;
case lack_left_bracket: detail="expected \'[\'."; break; case lack_right_curve: std::cout<<"expected \")\".\n"; break;
case lack_right_bracket: detail="expected \']\'."; break; case lack_left_bracket: std::cout<<"expected \"[\".\n"; break;
case lack_left_brace: detail="expected \'{\'."; break; case lack_right_bracket: std::cout<<"expected \"]\".\n"; break;
case lack_right_brace: detail="expected \'}\'."; break; case lack_left_brace: std::cout<<"expected \"{\".\n"; break;
case exprs_lack_rbrace: detail="expected \'}\' with this line\'s \'{\'.";break; case lack_right_brace: std::cout<<"expected \"}\".\n"; break;
case lack_semi: detail="expected \';\'."; break; case exprs_lack_rbrace: std::cout<<"expected \"}\" with this line\'s \"{\".\n";break;
case lack_comma: detail="expected \',\'."; break; case lack_semi: std::cout<<"expected \";\".\n"; break;
case lack_colon: detail="expected \':\'."; break; case lack_comma: std::cout<<"expected \",\".\n"; break;
case lack_equal: detail="expected \'=\'."; break; case lack_colon: std::cout<<"expected \":\".\n"; break;
case lack_scalar: detail="expected scalar here."; break; case lack_equal: std::cout<<"expected \"=\".\n"; break;
case lack_identifier: detail="expected identifier here."; break; case lack_scalar: std::cout<<"expected scalar here.\n"; break;
case lack_calculation: detail="expected arithmetic-expression here."; break; case lack_identifier: std::cout<<"expected identifier here.\n"; break;
case lack_exprs: detail="expected expression block here."; break; case lack_calculation: std::cout<<"expected arithmetic-expression here.\n"; break;
case lack_token: detail="expected \'"+error_str+"\' here."; break; case lack_exprs: std::cout<<"expected expression block here.\n"; break;
case lack_args: detail="expected arguments here."; break; case lack_token: std::cout<<"expected \""+error_str+"\" here.\n"; break;
case default_arg_not_end: detail="default argument missing for parameter of "+error_str+".";break; case lack_args: std::cout<<"expected arguments here.\n"; break;
case dynamic_id_not_end: detail="dynamic id must be the end of "+error_str+".";break; case default_arg_not_end: std::cout<<"default argument missing for parameter of "+error_str+".\n";break;
case name_repetition: detail="this identifier name has existed.";break; case dynamic_id_not_end: std::cout<<"dynamic id must be the end of "+error_str+".\n";break;
case definition_use_call: detail="should not use call_scalar in definition progress";break; case name_repetition: std::cout<<"this identifier name has existed.\n";break;
case multi_id_use_call: detail="should not use call_scalar in multi_id progress";break; case definition_use_call: std::cout<<"should not use call_scalar in definition progress.\n";break;
case multi_assign_lack_val:detail="multi-assignment lacks value list.";break; case multi_id_use_call: std::cout<<"should not use call_scalar in multi_id progress.\n";break;
case lack_definition: detail="expected a definition expression here.";break; case multi_assign_lack_val:std::cout<<"multi-assignment lacks value list.\n";break;
case lack_loop_iter: detail="expected an iterator to loop through.";break; case lack_definition: std::cout<<"expected a definition expression here.\n";break;
case lack_func_content: detail="expected arguments or expression block here.";break; case lack_loop_iter: std::cout<<"expected an iterator to loop through.\n";break;
case lack_func_content: std::cout<<"expected arguments or expression block here.\n";break;
} }
std::cout<<detail<<std::endl;
return; return;
} }

View File

@ -145,6 +145,15 @@ void nasal_parse::main_process()
error_info(error_line-1,lack_semi); error_info(error_line-1,lack_semi);
} }
} }
if(root.get_children().size())
{
int type=root.get_children().back().get_type();
if(type==ast_continue || type==ast_break || type==ast_return)
{
++error;
error_info(root.get_children().back().get_line(),error_expr,ast_str(type));
}
}
} }
return; return;
} }

View File

@ -18,14 +18,15 @@ bool nasal_resource::input_file(std::string filename)
std::ifstream fin(filename,std::ios::binary); std::ifstream fin(filename,std::ios::binary);
if(fin.fail()) if(fin.fail())
{ {
std::cout<<">> [resource] cannot open file \""<<filename<<"\"."<<std::endl; std::cout<<">> [resource] cannot open file \""<<filename<<"\".\n";
fin.close(); fin.close();
return false; return false;
} }
while(!fin.eof()) while(!fin.eof())
{ {
char c=fin.get(); char c=fin.get();
if(fin.eof()) break; if(fin.eof())
break;
res.push_back(c); res.push_back(c);
} }
fin.close(); fin.close();
@ -50,16 +51,19 @@ void nasal_resource::print_file()
std::cout<<unicode_str; std::cout<<unicode_str;
unicode_str=""; unicode_str="";
} }
if(32<=res[i]) std::cout<<res[i]; if(32<=res[i])
else if(res[i]<0) unicode_str+=res[i]; std::cout<<res[i];
else std::cout<<" "; else if(res[i]<0)
unicode_str+=res[i];
else
std::cout<<" ";
if(res[i]=='\n') if(res[i]=='\n')
{ {
++line; ++line;
std::cout<<std::endl<<line<<"\t"; std::cout<<std::endl<<line<<"\t";
} }
} }
std::cout<<(unicode_str.length()?unicode_str:"")<<std::endl; std::cout<<(unicode_str.length()?unicode_str:"")<<'\n';
return; return;
} }

View File

@ -282,16 +282,13 @@ int nasal_runtime::main_progress()
case ast_unary_sub:case ast_unary_not: case ast_unary_sub:case ast_unary_not:
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link: case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
case ast_trinocular:nasal_vm.del_reference(calculation(root.get_children()[i],-1));break; case ast_trinocular:nasal_vm.del_reference(calculation(root.get_children()[i],-1));break;
case ast_break:ret_state=rt_break;break;
case ast_continue:ret_state=rt_continue;break;
case ast_return:ret_state=rt_return;break;
} }
switch(ret_state) switch(ret_state)
{ {
case rt_break:std::cout<<">> [runtime] main_progress: cannot use break in main progress."<<std::endl;++error;break; case rt_break:std::cout<<">> [runtime] main_progress: cannot use break in main progress.\n";++error;break;
case rt_continue:std::cout<<">> [runtime] main_progress: cannot use continue in main progress."<<std::endl;++error;break; case rt_continue:std::cout<<">> [runtime] main_progress: cannot use continue in main progress.\n";++error;break;
case rt_return:std::cout<<">> [runtime] main_progress: cannot use return in main progress."<<std::endl;++error;break; case rt_return:std::cout<<">> [runtime] main_progress: cannot use return in main progress.\n";++error;break;
case rt_error:std::cout<<">> [runtime] main_progress: error occurred when executing main progress."<<std::endl;++error;break; case rt_error:std::cout<<">> [runtime] main_progress: error occurred when executing main progress.\n";++error;break;
} }
if(error) if(error)
{ {
@ -353,14 +350,14 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allo
} }
else else
{ {
std::cout<<">> [runtime] block_progress: return expression is not allowed here."<<std::endl; std::cout<<">> [runtime] block_progress: return expression is not allowed here.\n";
++error; ++error;
} }
break; break;
} }
if(ret_state==rt_error) if(ret_state==rt_error)
{ {
std::cout<<">> [runtime] block_progress: error occurred when executing sub-progress."<<std::endl; std::cout<<">> [runtime] block_progress: error occurred when executing sub-progress.\n";
++error; ++error;
} }
if(error || ret_state==rt_break || ret_state==rt_continue || ret_state==rt_return) if(error || ret_state==rt_break || ret_state==rt_continue || ret_state==rt_return)
@ -385,7 +382,7 @@ int nasal_runtime::before_for_loop(nasal_ast& node,int local_scope_addr)
case ast_unary_sub:case ast_unary_not: case ast_unary_sub:case ast_unary_not:
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link: case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break; case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
default:std::cout<<">> [runtime] before_for_loop: cannot use this expression before for-loop."<<std::endl;++error;break; default:std::cout<<">> [runtime] before_for_loop: cannot use this expression before for-loop.\n";++error;break;
} }
if(error) if(error)
return rt_error; return rt_error;
@ -406,7 +403,7 @@ int nasal_runtime::after_each_for_loop(nasal_ast& node,int local_scope_addr)
case ast_unary_sub:case ast_unary_not: case ast_unary_sub:case ast_unary_not:
case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link: case ast_add:case ast_sub:case ast_mult:case ast_div:case ast_link:
case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break; case ast_trinocular:nasal_vm.del_reference(calculation(node,local_scope_addr));break;
default:std::cout<<">> [runtime] after_each_for_loop: cannot use this expression after each for-loop."<<std::endl;++error;break; default:std::cout<<">> [runtime] after_each_for_loop: cannot use this expression after each for-loop.\n";++error;break;
} }
if(error) if(error)
return rt_error; return rt_error;
@ -459,7 +456,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
int vector_value_addr=calculation(vector_node,local_scope_addr); int vector_value_addr=calculation(vector_node,local_scope_addr);
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] loop_progress: "<<(loop_type==ast_forindex? "forindex":"foreach")<<" gets a value that is not a vector."<<std::endl; std::cout<<">> [runtime] loop_progress: "<<(loop_type==ast_forindex? "forindex":"foreach")<<" gets a value that is not a vector.\n";
++error; ++error;
return rt_error; return rt_error;
} }
@ -490,7 +487,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
mem_addr=call_scalar_mem(iter_node,local_scope_addr); mem_addr=call_scalar_mem(iter_node,local_scope_addr);
if(mem_addr<0) if(mem_addr<0)
{ {
std::cout<<">> [runtime] loop_progress: get null iterator."<<std::endl; std::cout<<">> [runtime] loop_progress: get null iterator.\n";
++error; ++error;
return rt_error; return rt_error;
} }
@ -571,7 +568,7 @@ bool nasal_runtime::check_condition(int value_addr)
int type=nasal_vm.gc_get(value_addr).get_type(); int type=nasal_vm.gc_get(value_addr).get_type();
if(type==vm_vector || type==vm_hash || type==vm_function || type==vm_closure) if(type==vm_vector || type==vm_hash || type==vm_function || type==vm_closure)
{ {
std::cout<<">> [runtime] check_condition: error value type when checking condition."<<std::endl; std::cout<<">> [runtime] check_condition: error value type when checking condition.\n";
++error; ++error;
return false; return false;
} }
@ -580,7 +577,7 @@ bool nasal_runtime::check_condition(int value_addr)
std::string str=nasal_vm.gc_get(value_addr).get_string(); std::string str=nasal_vm.gc_get(value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] check_condition: error value type, \'"<<str<<"\' is not a numerable string."<<std::endl; std::cout<<">> [runtime] check_condition: error value type, \'"<<str<<"\' is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -690,7 +687,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
int base_value_type=nasal_vm.gc_get(base_value_addr).get_type(); int base_value_type=nasal_vm.gc_get(base_value_addr).get_type();
if(base_value_type!=vm_vector && base_value_type!=vm_hash && base_value_type!=vm_string) if(base_value_type!=vm_vector && base_value_type!=vm_hash && base_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector: incorrect value type,expected a vector/hash/string."<<std::endl; std::cout<<">> [runtime] call_vector: incorrect value type,expected a vector/hash/string.\n";
++error; ++error;
return -1; return -1;
} }
@ -713,13 +710,13 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
int begin_index=0,end_index=0; int begin_index=0,end_index=0;
if(begin_value_type!=vm_nil && begin_value_type!=vm_number && begin_value_type!=vm_string) if(begin_value_type!=vm_nil && begin_value_type!=vm_number && begin_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector: begin index is not a number/numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: begin index is not a number/numerable string.\n";
++error; ++error;
return -1; return -1;
} }
if(end_value_type!=vm_nil && end_value_type!=vm_number && end_value_type!=vm_string) if(end_value_type!=vm_nil && end_value_type!=vm_number && end_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector: end index is not a number/numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: end index is not a number/numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -728,7 +725,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
std::string str=nasal_vm.gc_get(begin_value_addr).get_string(); std::string str=nasal_vm.gc_get(begin_value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] call_vector: begin index is not a numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: begin index is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -746,7 +743,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
std::string str=nasal_vm.gc_get(end_value_addr).get_string(); std::string str=nasal_vm.gc_get(end_value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] call_vector: end index is not a numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: end index is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -776,7 +773,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
{ {
if(begin_index>=end_index) if(begin_index>=end_index)
{ {
std::cout<<">> [runtime] call_vector: begin index must be less than end index."<<std::endl; std::cout<<">> [runtime] call_vector: begin index must be less than end index.\n";
++error; ++error;
return -1; return -1;
} }
@ -792,7 +789,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
int index_value_type=nasal_vm.gc_get(index_value_addr).get_type(); int index_value_type=nasal_vm.gc_get(index_value_addr).get_type();
if(index_value_type!=vm_number && index_value_type!=vm_string) if(index_value_type!=vm_number && index_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector: index is not a number/numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: index is not a number/numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -802,7 +799,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
std::string str=nasal_vm.gc_get(index_value_addr).get_string(); std::string str=nasal_vm.gc_get(index_value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] call_vector: index is not a numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: index is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -839,13 +836,13 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
{ {
if(call_size>1) if(call_size>1)
{ {
std::cout<<">> [runtime] call_vector: when calling a hash,only one key is alowed."<<std::endl; std::cout<<">> [runtime] call_vector: when calling a hash,only one key is alowed.\n";
++error; ++error;
return -1; return -1;
} }
if(node.get_children()[0].get_type()==ast_subvec) if(node.get_children()[0].get_type()==ast_subvec)
{ {
std::cout<<">> [runtime] call_vector: cannot slice hash."<<std::endl; std::cout<<">> [runtime] call_vector: cannot slice hash.\n";
++error; ++error;
return -1; return -1;
} }
@ -858,13 +855,13 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
{ {
if(call_size>1) if(call_size>1)
{ {
std::cout<<">> [runtime] call_vector: when calling a string,only one index is alowed."<<std::endl; std::cout<<">> [runtime] call_vector: when calling a string,only one index is alowed.\n";
++error; ++error;
return -1; return -1;
} }
if(node.get_children()[0].get_type()==ast_subvec) if(node.get_children()[0].get_type()==ast_subvec)
{ {
std::cout<<">> [runtime] call_vector: cannot slice string."<<std::endl; std::cout<<">> [runtime] call_vector: cannot slice string.\n";
++error; ++error;
return -1; return -1;
} }
@ -872,7 +869,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
int index_value_type=nasal_vm.gc_get(index_value_addr).get_type(); int index_value_type=nasal_vm.gc_get(index_value_addr).get_type();
if(index_value_type!=vm_number && index_value_type!=vm_string) if(index_value_type!=vm_number && index_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector: index is not a number/numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: index is not a number/numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -882,7 +879,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
std::string str=nasal_vm.gc_get(index_value_addr).get_string(); std::string str=nasal_vm.gc_get(index_value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] call_vector: index is not a numerable string."<<std::endl; std::cout<<">> [runtime] call_vector: index is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -897,7 +894,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
int str_size=str.length(); int str_size=str.length();
if(index_num>=str_size || index_num<-str_size) if(index_num>=str_size || index_num<-str_size)
{ {
std::cout<<">> [runtime] call_vector: index out of range."<<std::endl; std::cout<<">> [runtime] call_vector: index out of range.\n";
++error; ++error;
return -1; return -1;
} }
@ -910,7 +907,7 @@ int nasal_runtime::call_hash(nasal_ast& node,int base_value_addr,int local_scope
int value_type=nasal_vm.gc_get(base_value_addr).get_type(); int value_type=nasal_vm.gc_get(base_value_addr).get_type();
if(value_type!=vm_hash) if(value_type!=vm_hash)
{ {
std::cout<<">> [runtime] call_hash: incorrect value type,expected a hash."<<std::endl; std::cout<<">> [runtime] call_hash: incorrect value type,expected a hash.\n";
++error; ++error;
return -1; return -1;
} }
@ -924,7 +921,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
int value_type=nasal_vm.gc_get(base_value_addr).get_type(); int value_type=nasal_vm.gc_get(base_value_addr).get_type();
if(value_type!=vm_function) if(value_type!=vm_function)
{ {
std::cout<<">> [runtime] call_function: incorrect value type,expected a function."<<std::endl; std::cout<<">> [runtime] call_function: incorrect value type,expected a function.\n";
++error; ++error;
return -1; return -1;
} }
@ -953,7 +950,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
int sum=0; int sum=0;
for(int i=0;i<size;++i) for(int i=0;i<size;++i)
sum+=(argument_format.get_children()[i].get_type()!=ast_default_arg); sum+=(argument_format.get_children()[i].get_type()!=ast_default_arg);
std::cout<<">> [runtime] call_function: lack at least "<<sum<<" argument(s) but get 0."<<std::endl; std::cout<<">> [runtime] call_function: lack at least "<<sum<<" argument(s) but get 0.\n";
++error; ++error;
return -1; return -1;
} }
@ -1003,7 +1000,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
std::string id_name=tmp_node.get_children()[0].get_str(); std::string id_name=tmp_node.get_children()[0].get_str();
if(args_usage_table.find(id_name)==args_usage_table.end()) if(args_usage_table.find(id_name)==args_usage_table.end())
{ {
std::cout<<">> [runtime] call_function: identifier named \'"<<id_name<<"\' does not exist."<<std::endl; std::cout<<">> [runtime] call_function: identifier named \'"<<id_name<<"\' does not exist.\n";
++error; ++error;
return -1; return -1;
} }
@ -1044,7 +1041,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
for(std::map<std::string,bool>::iterator i=args_usage_table.begin();i!=args_usage_table.end();++i) for(std::map<std::string,bool>::iterator i=args_usage_table.begin();i!=args_usage_table.end();++i)
if(!i->second) if(!i->second)
{ {
std::cout<<">> [runtime] call_function: argument named \'"<<i->first<<"\' is not in use."<<std::endl; std::cout<<">> [runtime] call_function: argument named \'"<<i->first<<"\' is not in use.\n";
++error; ++error;
return -1; return -1;
} }
@ -1058,7 +1055,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
int tmp_val_addr=calculation(node.get_children()[i],local_scope_addr); int tmp_val_addr=calculation(node.get_children()[i],local_scope_addr);
if(tmp_val_addr<0) if(tmp_val_addr<0)
{ {
std::cout<<">> [runtime] call_function: error value address when generating argument list."<<std::endl; std::cout<<">> [runtime] call_function: error value address when generating argument list.\n";
++error; ++error;
return -1; return -1;
} }
@ -1067,7 +1064,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
int arg_format_size=argument_format.get_children().size(); int arg_format_size=argument_format.get_children().size();
if(size>arg_format_size && argument_format.get_children().back().get_type()!=ast_dynamic_id) if(size>arg_format_size && argument_format.get_children().back().get_type()!=ast_dynamic_id)
{ {
std::cout<<">> [runtime] call_function: too much arguments."<<std::endl; std::cout<<">> [runtime] call_function: too much arguments.\n";
++error; ++error;
return -1; return -1;
} }
@ -1090,7 +1087,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
run_closure.add_new_value(tmp_node.get_str(),args[i]); run_closure.add_new_value(tmp_node.get_str(),args[i]);
else else
{ {
std::cout<<">> [runtime] call_function: lack argument(s).stop."<<std::endl; std::cout<<">> [runtime] call_function: lack argument(s).stop.\n";
++error; ++error;
return -1; return -1;
} }
@ -1114,7 +1111,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
if(ret_state==rt_break || ret_state==rt_continue) if(ret_state==rt_break || ret_state==rt_continue)
{ {
std::cout<<">> [runtime] call_function: break and continue are not allowed to be used here."<<std::endl; std::cout<<">> [runtime] call_function: break and continue are not allowed to be used here.\n";
++error; ++error;
return -1; return -1;
} }
@ -1152,7 +1149,7 @@ int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr)
mem_address=nasal_vm.gc_get(global_scope_address).get_closure().get_mem_address(node.get_str()); mem_address=nasal_vm.gc_get(global_scope_address).get_closure().get_mem_address(node.get_str());
if(mem_address<0) if(mem_address<0)
{ {
std::cout<<">> [runtime] call_scalar_mem: cannot find value named \'"<<node.get_str()<<"\'."<<std::endl; std::cout<<">> [runtime] call_scalar_mem: cannot find value named \'"<<node.get_str()<<"\'.\n";
++error; ++error;
return -1; return -1;
} }
@ -1164,7 +1161,7 @@ int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr)
mem_address=nasal_vm.gc_get(global_scope_address).get_closure().get_mem_address(node.get_children()[0].get_str()); mem_address=nasal_vm.gc_get(global_scope_address).get_closure().get_mem_address(node.get_children()[0].get_str());
if(mem_address<0) if(mem_address<0)
{ {
std::cout<<">> [runtime] call_scalar_mem: cannot find value named \'"<<node.get_children()[0].get_str()<<"\'."<<std::endl; std::cout<<">> [runtime] call_scalar_mem: cannot find value named \'"<<node.get_children()[0].get_str()<<"\'.\n";
++error; ++error;
return -1; return -1;
} }
@ -1178,7 +1175,7 @@ int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr)
case ast_call_vec: tmp_mem_addr=call_vector_mem(call_expr,mem_address,local_scope_addr);break; case ast_call_vec: tmp_mem_addr=call_vector_mem(call_expr,mem_address,local_scope_addr);break;
case ast_call_hash: tmp_mem_addr=call_hash_mem(call_expr,mem_address,local_scope_addr);break; case ast_call_hash: tmp_mem_addr=call_hash_mem(call_expr,mem_address,local_scope_addr);break;
case ast_call_func: case ast_call_func:
std::cout<<">> [runtime] call_scalar_mem: cannot change the value that function returns."<<std::endl; std::cout<<">> [runtime] call_scalar_mem: cannot change the value that function returns.\n";
++error; ++error;
return -1; return -1;
break; break;
@ -1187,7 +1184,7 @@ int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr)
if(mem_address<0) if(mem_address<0)
{ {
++error; ++error;
std::cout<<">> [runtime] call_scalar_mem: cannot find correct memory space."<<std::endl; std::cout<<">> [runtime] call_scalar_mem: cannot find correct memory space.\n";
break; break;
} }
} }
@ -1200,14 +1197,14 @@ int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_s
int base_value_type=nasal_vm.gc_get(base_value_addr).get_type(); int base_value_type=nasal_vm.gc_get(base_value_addr).get_type();
if(base_value_type!=vm_vector && base_value_type!=vm_hash) if(base_value_type!=vm_vector && base_value_type!=vm_hash)
{ {
std::cout<<">> [runtime] call_vector_mem: incorrect value type,expected a vector/hash."<<std::endl; std::cout<<">> [runtime] call_vector_mem: incorrect value type,expected a vector/hash.\n";
++error; ++error;
return -1; return -1;
} }
int call_size=node.get_children().size(); int call_size=node.get_children().size();
if(call_size>1) if(call_size>1)
{ {
std::cout<<">> [runtime] call_vector_mem: when searching a memory space in a vector,only one index is alowed."<<std::endl; std::cout<<">> [runtime] call_vector_mem: when searching a memory space in a vector,only one index is alowed.\n";
++error; ++error;
return -1; return -1;
} }
@ -1216,7 +1213,7 @@ int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_s
nasal_vector& reference_value=nasal_vm.gc_get(base_value_addr).get_vector(); nasal_vector& reference_value=nasal_vm.gc_get(base_value_addr).get_vector();
if(node.get_children()[0].get_type()==ast_subvec) if(node.get_children()[0].get_type()==ast_subvec)
{ {
std::cout<<">> [runtime] call_vector_mem: sub-vector in this progress is a temporary value and cannot be changed."<<std::endl; std::cout<<">> [runtime] call_vector_mem: sub-vector in this progress is a temporary value and cannot be changed.\n";
++error; ++error;
return -1; return -1;
} }
@ -1224,7 +1221,7 @@ int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_s
int index_value_type=nasal_vm.gc_get(index_value_addr).get_type(); int index_value_type=nasal_vm.gc_get(index_value_addr).get_type();
if(index_value_type!=vm_number && index_value_type!=vm_string) if(index_value_type!=vm_number && index_value_type!=vm_string)
{ {
std::cout<<">> [runtime] call_vector_mem: index is not a number/numerable string."<<std::endl; std::cout<<">> [runtime] call_vector_mem: index is not a number/numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -1234,7 +1231,7 @@ int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_s
std::string str=nasal_vm.gc_get(index_value_addr).get_string(); std::string str=nasal_vm.gc_get(index_value_addr).get_string();
if(!check_numerable_string(str)) if(!check_numerable_string(str))
{ {
std::cout<<">> [runtime] call_vector_mem: index is not a numerable string."<<std::endl; std::cout<<">> [runtime] call_vector_mem: index is not a numerable string.\n";
++error; ++error;
return -1; return -1;
} }
@ -1249,7 +1246,7 @@ int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_s
{ {
if(call_size>1) if(call_size>1)
{ {
std::cout<<">> [runtime] call_vector_mem: when calling a hash,only one key is alowed."<<std::endl; std::cout<<">> [runtime] call_vector_mem: when calling a hash,only one key is alowed.\n";
++error; ++error;
return -1; return -1;
} }
@ -1264,7 +1261,7 @@ int nasal_runtime::call_hash_mem(nasal_ast& node,int base_mem_addr,int local_sco
int value_type=nasal_vm.gc_get(base_value_addr).get_type(); int value_type=nasal_vm.gc_get(base_value_addr).get_type();
if(value_type!=vm_hash) if(value_type!=vm_hash)
{ {
std::cout<<">> [runtime] call_hash_mem: incorrect value type,expected a hash."<<std::endl; std::cout<<">> [runtime] call_hash_mem: incorrect value type,expected a hash.\n";
++error; ++error;
return -1; return -1;
} }
@ -1293,7 +1290,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
ret_address=nasal_vm.gc_get(global_scope_address).get_closure().get_value_address(node.get_str()); ret_address=nasal_vm.gc_get(global_scope_address).get_closure().get_value_address(node.get_str());
if(ret_address<0) if(ret_address<0)
{ {
std::cout<<">> [runtime] calculation: cannot find value named \'"<<node.get_str()<<"\'."<<std::endl; std::cout<<">> [runtime] calculation: cannot find value named \'"<<node.get_str()<<"\'.\n";
++error; ++error;
return -1; return -1;
} }
@ -1518,13 +1515,13 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
} }
else else
{ {
std::cout<<">> [runtime] calculation: this expression cannot be calculated.expression type:"<<ast_str(node.get_type())<<"."<<std::endl; std::cout<<">> [runtime] calculation: this expression cannot be calculated.expression type:"<<ast_str(node.get_type())<<".\n";
++error; ++error;
return -1; return -1;
} }
if(ret_address<0) if(ret_address<0)
{ {
std::cout<<">> [runtime] calculation: incorrect values are used in calculation."<<std::endl; std::cout<<">> [runtime] calculation: incorrect values are used in calculation.\n";
++error; ++error;
} }
return ret_address; return ret_address;
@ -1535,7 +1532,7 @@ void nasal_runtime::definition(nasal_ast& node,int local_scope_addr)
nasal_ast& value_node=node.get_children()[1]; nasal_ast& value_node=node.get_children()[1];
if(define_node.get_type()==ast_identifier && value_node.get_type()==ast_multi_scalar) if(define_node.get_type()==ast_identifier && value_node.get_type()==ast_multi_scalar)
{ {
std::cout<<">> [runtime] definition: one identifier cannot accept too many values."<<std::endl; std::cout<<">> [runtime] definition: one identifier cannot accept too many values.\n";
++error; ++error;
return; return;
} }
@ -1558,7 +1555,7 @@ void nasal_runtime::definition(nasal_ast& node,int local_scope_addr)
int val_size=value_node.get_children().size(); int val_size=value_node.get_children().size();
if(id_size!=val_size) if(id_size!=val_size)
{ {
std::cout<<">> [runtime] definition: size of identifiers and size of values do not match."<<std::endl; std::cout<<">> [runtime] definition: size of identifiers and size of values do not match.\n";
++error; ++error;
return; return;
} }
@ -1573,14 +1570,14 @@ void nasal_runtime::definition(nasal_ast& node,int local_scope_addr)
int value_addr=calculation(value_node,local_scope_addr); int value_addr=calculation(value_node,local_scope_addr);
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] definition: must use vector in multi-definition."<<std::endl; std::cout<<">> [runtime] definition: must use vector in multi-definition.\n";
++error; ++error;
return; return;
} }
nasal_vector& ref_vector=nasal_vm.gc_get(value_addr).get_vector(); nasal_vector& ref_vector=nasal_vm.gc_get(value_addr).get_vector();
if(ref_vector.size()!=id_size) if(ref_vector.size()!=id_size)
{ {
std::cout<<">> [runtime] definition: size of identifiers and size of values do not match."<<std::endl; std::cout<<">> [runtime] definition: size of identifiers and size of values do not match.\n";
++error; ++error;
return; return;
} }
@ -1605,7 +1602,7 @@ void nasal_runtime::multi_assignment(nasal_ast& node,int local_scope_addr)
nasal_ast& tmp_node=multi_call_node.get_children()[i]; nasal_ast& tmp_node=multi_call_node.get_children()[i];
if(tmp_node.get_type()!=ast_call && tmp_node.get_type()!=ast_identifier) if(tmp_node.get_type()!=ast_call && tmp_node.get_type()!=ast_identifier)
{ {
std::cout<<">> [runtime] multi_assignment: multi-assignment must use available memory address."<<std::endl; std::cout<<">> [runtime] multi_assignment: multi-assignment must use available memory address.\n";
++error; ++error;
return; return;
} }
@ -1616,7 +1613,7 @@ void nasal_runtime::multi_assignment(nasal_ast& node,int local_scope_addr)
int val_size=value_node.get_children().size(); int val_size=value_node.get_children().size();
if(id_size!=val_size) if(id_size!=val_size)
{ {
std::cout<<">> [runtime] multi_assignment: size of calls and size of values do not match."<<std::endl; std::cout<<">> [runtime] multi_assignment: size of calls and size of values do not match.\n";
++error; ++error;
return; return;
} }
@ -1633,14 +1630,14 @@ void nasal_runtime::multi_assignment(nasal_ast& node,int local_scope_addr)
return; return;
if(nasal_vm.gc_get(value_addr).get_type()!=vm_vector) if(nasal_vm.gc_get(value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] multi_assignment: must use vector in multi-assignment."<<std::endl; std::cout<<">> [runtime] multi_assignment: must use vector in multi-assignment.\n";
++error; ++error;
return; return;
} }
nasal_vector& ref_vector=nasal_vm.gc_get(value_addr).get_vector(); nasal_vector& ref_vector=nasal_vm.gc_get(value_addr).get_vector();
if(ref_vector.size()!=id_size) if(ref_vector.size()!=id_size)
{ {
std::cout<<">> [runtime] multi_assignment: size of calls and size of values do not match."<<std::endl; std::cout<<">> [runtime] multi_assignment: size of calls and size of values do not match.\n";
++error; ++error;
return; return;
} }