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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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();

View File

@ -45,14 +45,16 @@ class balloon_scope
{
if(!scope_list.empty() && !scope_list.back().empty())
{
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
for(;;--i)
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return true;
if(!i->empty())
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return true;
}
if(i==scope_list.back().begin())
break;
}
@ -77,6 +79,27 @@ class balloon_scope
global.push_back(t);
return;
}
void print_last_block()
{
if(!scope_list.empty() && !scope_list.back().empty())
{
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
// get the last scope block(std::list<std::list<var> >)
for(;;--i)
{
if(!i->empty())
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
std::cout<<j->get_name()<<std::endl;
}
if(i==scope_list.back().begin())
break;
}
}
return;
}
var get_var(std::string name)
{
if(!scope_list.empty() && !scope_list.back().empty())
@ -86,9 +109,12 @@ class balloon_scope
// get the last scope block(std::list<std::list<var> >)
for(;;--i)
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return *j;
if(!i->empty())
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return *j;
}
if(i==scope_list.back().begin())
break;
}
@ -101,24 +127,70 @@ class balloon_scope
}
return error_var;
}
var* append_get_addr(std::string name)
{
var* addr=NULL;
if(!scope_list.empty())
{
int cnt=1;
std::list<std::list<std::list<var> > >::iterator blk=scope_list.end();
--blk;
for(;;--blk,++cnt)
{
if(!blk->empty())
{
std::list<std::list<var> >::iterator i=blk->end();
--i;
for(;;--i)
{
if(!i->empty())
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
{
addr=&(*j);
return addr;
}
}
if(i==blk->begin())
break;
}
}
if(cnt==2 || blk==scope_list.begin())
break;
}
}
if(!global.empty())
{
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
{
addr=&(*i);
return addr;
}
}
return &error_var;
}
var* get_addr(std::string name)
{
var* addr=NULL;
if(!scope_list.empty() && !scope_list.back().empty())
if(!scope_list.empty())
{
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
// get the last scope block(std::list<std::list<var> >)
for(;;--i)
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
{
addr=&(*j);
return addr;
}
if(i==scope_list.back().begin())
break;
if(!i->empty())
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
{
addr=&(*j);
return addr;
}
if(i==scope_list.back().begin())
break;
}
}
}
if(!global.empty())

View File

@ -1,12 +1,12 @@
# this file includes functions:
# append
# subvec
var append(vector,elements...)
var append=func(vector,elements...)
{
return __call_special_inline_function(vector,elements);
};
var subvec(vector,begin,length)
var subvec=func(vector,begin,length)
{
var new_vector=[];
for(var i=begin;i<begin+length;i+=1)
@ -16,7 +16,7 @@ var subvec(vector,begin,length)
return new_vector;
};
var int(value)
var int=func(value)
{
return __call_Cpp_int(value);
};

View File

@ -3,10 +3,10 @@
resource_file prog;
balloon_lexer lex;
balloon_parse pas;
std::string command;
int main()
{
std::string command;
std::cout<<">> Balloon interpreter by ValKmjolnir"<<std::endl;
std::cout<<">> Input [help] to find help."<<std::endl;
while(1)