diff --git a/version1.2/nasal_runtime.h b/version1.2/nasal_runtime.h index b5d7b7f..67cd1dc 100644 --- a/version1.2/nasal_runtime.h +++ b/version1.2/nasal_runtime.h @@ -117,58 +117,10 @@ class var } }; -class var_scope -{ - private: - std::list var_list; - public: - var_scope() - { - var_list.clear(); - var null_var; - std::string null_name_str="$"; - null_var.set_name(null_name_str); - var_list.push_back(null_var); - return; - } - 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()) - { - std::cout<<">>[Runtime-error] redeclaration of '"<& get_list() - { - return var_list; - } - var& search_var(std::string& str) - { - for(auto i=var_list.begin();i!=var_list.end();++i) - if(i->get_name()==str) - return *i; - std::cout<<">>[Runtime-error] '"< scope_list; + std::list> scope_list; var error_var; public: var_scope_manager() @@ -185,8 +137,8 @@ class var_scope_manager } 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) + for(std::list>::iterator i=scope_list.begin();i!=scope_list.end();++i) + for(std::list::iterator j=i->begin();j!=i->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) + for(std::list>::iterator i=scope_list.begin();i!=scope_list.end();++i) + for(std::list::iterator j=i->begin();j!=i->end();++j) if(j->get_name()==new_var.get_name()) { - std::cout<<">>[Runtime] redefinition of var '"<>[Runtime] redeclaration of var '"<::iterator i=scope_list.end(); + std::list>::iterator i=scope_list.end(); --i; - i->get_list().push_back(new_var); + i->push_back(new_var); } else std::cout<<">>[Runtime] empty scope list."< new_list; + scope_list.push_back(new_list); return; } void pop_last_scope() @@ -231,6 +183,7 @@ class nasal_runtime { private: abstract_syntax_tree root; + var_scope_manager scope; public: nasal_runtime() { @@ -254,7 +207,7 @@ class nasal_runtime std::cout<<">>[Runtime] runtime got the ast-root: "<<((void *)&tree)<<"->"<<((void *)&root)<<"."<::iterator i=tree.get_children().begin();i!=tree.get_children().end();++i) @@ -316,29 +270,80 @@ void nasal_runtime::run_root(abstract_syntax_tree& tree) case __number: case __string: scalar_call(*i); - return; + break; default: std::cout<<">>[Debug] error occurred."<::iterator iter=tree.get_children().begin(); - new_var.set_name(iter->get_var_name()); + std::string var_name=iter->get_var_name(); ++iter; if(iter==tree.get_children().end()) { new_var.set_type(__null_type); - - return new_var; + new_var.set_name(var_name); + scope.add_var(new_var); + return; } - return new_var; + else + { + switch(iter->get_type()) + { + case __add_operator: + case __sub_operator: + case __mul_operator: + case __div_operator: + case __link_operator: + case __and_operator: + case __or_operator: + case __nor_operator: + case __cmp_equal: + case __cmp_not_equal: + case __cmp_less: + case __cmp_less_or_equal: + case __cmp_more: + case __cmp_more_or_equal: + new_var=run_calculation(*iter); + break; + case __call_function: + new_var=run_function(*iter); + break; + case __id: + case __hash_search: + case __list_search: + new_var=identifier_call(*iter); + break; + case __number: + case __string: + new_var=scalar_call(*iter); + break; + case __function: + ; + break; + case __list: + break; + case __hash: + break; + default: + std::cout<<">>[Debug] error occurred."<