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); scope.add_new_var(self_func);
abstract_syntax_tree para=children.front(); abstract_syntax_tree para=children.front();// get parameter name(declared in function)
abstract_syntax_tree blk=children.back(); abstract_syntax_tree blk=children.back(); // get block
std::list<abstract_syntax_tree>::iterator para_name=para.children.begin(); std::list<abstract_syntax_tree>::iterator para_name=para.children.begin();
std::list<var>::iterator para_value=parameter.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) if(exit_type==__error_value_type)
break; break;
} }
// this must be added when running a function
ret.set_type(__var_number); ret.set_type(__var_number);
if(exit_type!=__error_value_type) if(exit_type!=__error_value_type)
ret.set_number(1); 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.set_number(0);
ret_stack.push(ret); 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 else
{ {
for(;para_name!=para.children.end();++para_name,++para_value) 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); new_var.set_name(para_name->name);
scope.add_new_var(new_var); scope.add_new_var(new_var);
} }
// this must be added when running a function
if(exit_type==__process_exited_successfully) if(exit_type==__process_exited_successfully)
{ {
int _t=blk.run_block(); int _t=blk.run_block();

View File

@ -45,14 +45,16 @@ class balloon_scope
{ {
if(!scope_list.empty() && !scope_list.back().empty()) if(!scope_list.empty() && !scope_list.back().empty())
{ {
std::list<std::list<var> >::iterator i=scope_list.back().end(); std::list<std::list<var> >::iterator i=scope_list.back().end();
--i; --i;
for(;;--i) for(;;--i)
{ {
for(std::list<var>::iterator j=i->begin();j!=i->end();++j) if(!i->empty())
if(j->get_name()==name) {
return true; 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()) if(i==scope_list.back().begin())
break; break;
} }
@ -77,6 +79,27 @@ class balloon_scope
global.push_back(t); global.push_back(t);
return; 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) var get_var(std::string name)
{ {
if(!scope_list.empty() && !scope_list.back().empty()) 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> >) // get the last scope block(std::list<std::list<var> >)
for(;;--i) for(;;--i)
{ {
for(std::list<var>::iterator j=i->begin();j!=i->end();++j) if(!i->empty())
if(j->get_name()==name) {
return *j; 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()) if(i==scope_list.back().begin())
break; break;
} }
@ -101,24 +127,70 @@ class balloon_scope
} }
return error_var; 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* get_addr(std::string name)
{ {
var* addr=NULL; 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(); std::list<std::list<var> >::iterator i=scope_list.back().end();
--i; --i;
// get the last scope block(std::list<std::list<var> >)
for(;;--i) for(;;--i)
{ {
for(std::list<var>::iterator j=i->begin();j!=i->end();++j) if(!i->empty())
if(j->get_name()==name) {
{ for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
addr=&(*j); if(j->get_name()==name)
return addr; {
} addr=&(*j);
if(i==scope_list.back().begin()) return addr;
break; }
if(i==scope_list.back().begin())
break;
}
} }
} }
if(!global.empty()) if(!global.empty())

View File

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

View File

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