diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index 56bbb3a..55389e0 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -894,8 +894,8 @@ var abstract_syntax_tree::run_func(std::list 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::iterator para_name=para.children.begin(); std::list::iterator para_value=parameter.begin(); @@ -939,6 +939,7 @@ var abstract_syntax_tree::run_func(std::list 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 parameter,var self_func) ret.set_number(0); ret_stack.push(ret); } + else if(self_func.get_name()=="append") + { + if(!parameter.empty()) + { + std::list::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 "<get_name()<<"\'."<>[Runtime-error] line "< 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(); diff --git a/balloon/balloon_scope.h b/balloon/balloon_scope.h index 10e8488..ac49af7 100644 --- a/balloon/balloon_scope.h +++ b/balloon/balloon_scope.h @@ -45,14 +45,16 @@ class balloon_scope { if(!scope_list.empty() && !scope_list.back().empty()) { - std::list >::iterator i=scope_list.back().end(); --i; for(;;--i) { - for(std::list::iterator j=i->begin();j!=i->end();++j) - if(j->get_name()==name) - return true; + if(!i->empty()) + { + for(std::list::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 >::iterator i=scope_list.back().end(); + --i; + // get the last scope block(std::list >) + for(;;--i) + { + if(!i->empty()) + { + for(std::list::iterator j=i->begin();j!=i->end();++j) + std::cout<get_name()< >) for(;;--i) { - for(std::list::iterator j=i->begin();j!=i->end();++j) - if(j->get_name()==name) - return *j; + if(!i->empty()) + { + for(std::list::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 > >::iterator blk=scope_list.end(); + --blk; + for(;;--blk,++cnt) + { + if(!blk->empty()) + { + std::list >::iterator i=blk->end(); + --i; + for(;;--i) + { + if(!i->empty()) + { + for(std::list::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::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 >::iterator i=scope_list.back().end(); --i; - // get the last scope block(std::list >) for(;;--i) { - for(std::list::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::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()) diff --git a/balloon/lib/basics.nas b/balloon/lib/basics.nas index 98eb592..996daf2 100644 --- a/balloon/lib/basics.nas +++ b/balloon/lib/basics.nas @@ -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> Balloon interpreter by ValKmjolnir"<> Input [help] to find help."<