Add func:append & fixed serious bugs

This commit is contained in:
Valk Richard Li
2019-11-23 13:28:28 +08:00
committed by GitHub
parent b4468c6cc1
commit 000402a56d
4 changed files with 128 additions and 23 deletions

View File

@@ -894,8 +894,8 @@ var abstract_syntax_tree::run_func(std::list<var> parameter,var self_func)
scope.add_new_var(self_func);
abstract_syntax_tree para=children.front();
abstract_syntax_tree blk=children.back();
abstract_syntax_tree para=children.front();// get parameter name(declared in function)
abstract_syntax_tree blk=children.back(); // get block
std::list<abstract_syntax_tree>::iterator para_name=para.children.begin();
std::list<var>::iterator para_value=parameter.begin();
@@ -939,6 +939,7 @@ var abstract_syntax_tree::run_func(std::list<var> parameter,var self_func)
if(exit_type==__error_value_type)
break;
}
// this must be added when running a function
ret.set_type(__var_number);
if(exit_type!=__error_value_type)
ret.set_number(1);
@@ -946,6 +947,37 @@ var abstract_syntax_tree::run_func(std::list<var> parameter,var self_func)
ret.set_number(0);
ret_stack.push(ret);
}
else if(self_func.get_name()=="append")
{
if(!parameter.empty())
{
std::list<var>::iterator i=parameter.begin();
var* array_addr=scope.append_get_addr(i->get_name());
if(array_addr!=&error_var)
{
++i;
for(;i!=parameter.end();++i)
array_addr->append_array(*i);
}
else
{
std::cout<<">>[Runtime-error] line "<<line<<": cannot find a var named \'"<<parameter.begin()->get_name()<<"\'."<<std::endl;
exit_type=__find_var_failure;
}
}
else
{
exit_type=__lack_parameter;
std::cout<<">>[Runtime-error] line "<<line<<": lack parameter(s)."<<std::endl;
}
// this must be added when running a function
ret.set_type(__var_number);
if(exit_type!=__find_var_failure)
ret.set_number(1);
else
ret.set_number(0);
ret_stack.push(ret);
}
else
{
for(;para_name!=para.children.end();++para_name,++para_value)
@@ -961,6 +993,7 @@ var abstract_syntax_tree::run_func(std::list<var> parameter,var self_func)
new_var.set_name(para_name->name);
scope.add_new_var(new_var);
}
// this must be added when running a function
if(exit_type==__process_exited_successfully)
{
int _t=blk.run_block();