From ab0e3c8447f7ed2bff0d10285a6528beabbf93c5 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Tue, 29 Oct 2019 15:34:57 +0800 Subject: [PATCH] Add var scope --- version1.2/nasal_runtime.h | 90 +++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 15 deletions(-) diff --git a/version1.2/nasal_runtime.h b/version1.2/nasal_runtime.h index 7273bab..b5d7b7f 100644 --- a/version1.2/nasal_runtime.h +++ b/version1.2/nasal_runtime.h @@ -117,24 +117,26 @@ class var } }; -class var_list_manager +class var_scope { private: std::list var_list; - std::list var_scope; public: - var_list_manager() + var_scope() { var_list.clear(); - var_scope.clear(); var null_var; std::string null_name_str="$"; null_var.set_name(null_name_str); var_list.push_back(null_var); - var_scope.push_back(0); return; } - void add_var(var& tmp,int scope_depth) + var_scope(const var_scope& p) + { + var_list=p.var_list; + return; + } + void add_var(var& tmp) { for(auto i=var_list.begin();i!=var_list.end();++i) if(i->get_name()==tmp.get_name()) @@ -143,7 +145,6 @@ class var_list_manager return; } var_list.push_back(tmp); - var_scope.push_back(scope_depth); return; } void del_latest_var() @@ -151,6 +152,10 @@ class var_list_manager var_list.pop_back(); return; } + std::list& get_list() + { + return var_list; + } var& search_var(std::string& str) { for(auto i=var_list.begin();i!=var_list.end();++i) @@ -159,11 +164,66 @@ class var_list_manager std::cout<<">>[Runtime-error] '"< scope_list; + var error_var; + public: + var_scope_manager() { - std::list::iterator i=var_scope.end(); - --i; - return *i; + scope_list.clear(); + std::string str="err_ret"; + error_var.set_name(str); + return; + } + void set_clear() + { + scope_list.clear(); + return; + } + var& search_var(std::string str) + { + for(std::list::iterator i=scope_list.begin();i!=scope_list.end();++i) + for(std::list::iterator j=i->get_list().begin();j!=i->get_list().end();++j) + if(j->get_name()==str) + return *j; + std::cout<<">>[Runtime] could not find the var named '"<::iterator i=scope_list.begin();i!=scope_list.end();++i) + for(std::list::iterator j=i->get_list().begin();j!=i->get_list().end();++j) + if(j->get_name()==new_var.get_name()) + { + std::cout<<">>[Runtime] redefinition of var '"<::iterator i=scope_list.end(); + --i; + i->get_list().push_back(new_var); + } + else + std::cout<<">>[Runtime] empty scope list."<>[Runtime] scope poped empty thing."<>[Runtime] runtime got the ast-root: "<<((void *)&tree)<<"->"<<((void *)&root)<<"."<::iterator iter=tree.get_children().begin(); @@ -276,9 +336,9 @@ void nasal_runtime::run_definition(abstract_syntax_tree& tree) { new_var.set_type(__null_type); - return; + return new_var; } - return; + return new_var; } void nasal_runtime::run_assignment(abstract_syntax_tree& tree) {