Add func:append & fixed serious bugs
This commit is contained in:
parent
b4468c6cc1
commit
000402a56d
|
@ -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();
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
};
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue