From bc5ae6384bf34b6cba5ef83f2c5bedc696930e74 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 27 Nov 2019 17:07:30 +0800 Subject: [PATCH] bug fixed --- balloon/abstract_syntax_tree.cpp | 38 ++++++++++++++++++-------------- balloon/balloon.h | 1 + 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index e75044d..00e9638 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -7,6 +7,7 @@ int exit_type=0; std::stack ret_stack; // for function ret use(especially the recursion) int recursion_depth=0; // avoid deep recursion to sigsegv std::string str_for_input; // avoid stack overflow +var* append_addr; // used in append function var abstract_syntax_tree::calculation() { @@ -518,9 +519,16 @@ var abstract_syntax_tree::call_identifier() self.set_type(__var_function); self.set_name(temp.get_name()); self.set_function(temp.get_function()); + if(temp.get_name()=="append") + { + append_addr=NULL; + if(!i->children.empty()) + append_addr=i->children.begin()->get_var_addr(); + } std::list parameter; - for(std::list::iterator j=i->children.begin();j!=i->children.end();++j) - parameter.push_back(j->calculation()); + if(!i->children.empty()) + for(std::list::iterator j=i->children.begin();j!=i->children.end();++j) + parameter.push_back(j->calculation()); temp=temp.get_function().run_func(parameter,self); } else @@ -958,29 +966,25 @@ var abstract_syntax_tree::run_func(std::list parameter,var self_func) } else if(self_func.get_name()=="append") { - if(!parameter.empty()) + if(append_addr) { std::list::iterator i=parameter.begin(); - var* array_addr=scope.append_get_addr(i->get_name()); - if(array_addr->get_type()==__var_array) + if(append_addr->get_type()==__var_array) { - if(array_addr!=&error_var) - { - ++i; - for(;i!=parameter.end();++i) - array_addr->append_array(*i); - } - else - { - std::cout<<">>[Runtime-error] line "<get_name()<<"\'."<append_array(*i); + } + else if(append_addr->get_type()==__null_type) + { + std::cout<<">>[Runtime-error] line "<get_name()<<"\'."<>[Runtime-error] line "< ret_stack; // for function ret use int recursion_depth; // avoid too deep recursion std::string str_for_input // global value str to avoid stack overflow + var* append_addr // used in append function , to get a correct addr of all kinds of arrays */ #endif