#ifndef __NASAL_RUNTIME_H__ #define __NASAL_RUNTIME_H__ class var { private: int type; std::string name; double number; std::string str; std::list var_list; std::list var_hash; abstract_syntax_tree function; public: var() { type=0; name=""; number=0; str=""; function.set_clear(); } var(const var& p) { type=p.type; name=p.name; number=p.number; str=p.str; function=p.function; } var& operator=(const var& p) { type=p.type; name=p.name; number=p.number; str=p.str; function=p.function; return *this; } void print_information() { std::cout<<"[ type: ";print_token(type);std::cout<<" ]"; std::cout<<"[ name: "<>[Runtime-error] function type cannot be printed."< p) { var_list=p; return; } void append_list(var p) { var_list.push_back(p); return; } void set_hash(std::list p) { var_hash=p; return; } void append_hash(var p) { var_hash.push_back(p); return; } int get_type() { return type; } std::string get_name() { return name; } double get_number() { return number; } std::string get_string() { return str; } abstract_syntax_tree get_function() { return function; } std::list get_list() { return var_list; } std::list get_hash() { return var_hash; } }; class var_scope_manager { private: std::list> scope_list; std::list scope_type; var error_var; public: var_scope_manager() { scope_list.clear(); std::string str="__nas_strc_error_ret"; error_var.set_name(str); error_var.set_type(__null_type); return; } void set_clear() { scope_list.clear(); scope_type.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->begin();j!=i->end();++j) if(j->get_name()==str) return *j; std::cout<>[Runtime-error] could not find the var '"<>::iterator i=scope_list.begin(); std::list::iterator t=scope_type.begin(); // get global scopes for(;i!=scope_list.end();++i,++t) { if(*t!=__function) { for(std::list::iterator j=i->begin();j!=i->end();++j) if(j->get_name()==new_var.get_name()) { std::cout<>[Runtime-error] redeclaration of var '"<::iterator j=i->begin();j!=i->end();++j) if(j->get_name()==new_var.get_name()) { std::cout<>[Runtime-error] redeclaration of var '"<push_back(new_var); } else std::cout<>[Runtime-error] empty scope list."< new_list; scope_list.push_back(new_list); scope_type.push_back(type); return; } void pop_last_scope() { if(!scope_list.empty()) { scope_list.pop_back(); scope_type.pop_back(); } else std::cout<>[Runtime-error] scope poped empty thing."<>[Runtime] process begins."<>[Runtime] process exited after "<>[Runtime] runtime got the ast-root: "<<((void *)&tree)<<"->"<<((void *)&root)<<"."<::iterator i=tree.get_children().begin();i!=tree.get_children().end();++i) { switch(i->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: run_calculation(*i); break; case __definition: run_definition(*i); break; case __assignment: run_assignment(*i); break; case __while: case __for: case __forindex: case __foreach: run_loop(*i); break; case __ifelse: run_if_else(*i); break; case __call_function: run_function(*i); break; case __id: case __hash_search: case __list_search: identifier_call(*i); break; case __number: case __string: scalar_call(*i); break; default: std::cout<<">>[Debug] error occurred."<::iterator iter=tree.get_children().begin(); std::string var_name=iter->get_var_name(); ++iter; if(iter==tree.get_children().end()) { new_var.set_type(__null_type); new_var.set_name(var_name); scope.add_var(new_var); return; } 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: break; case __number: case __string: new_var=scalar_call(*iter); break; case __function: new_var.set_type(__function); new_var.set_function(*iter); break; case __list: break; case __hash: break; default: std::cout<<">>[Debug] error occurred."<::iterator i; i=tree.get_children().begin(); switch(i->get_type()) { case __id:left_child=identifier_call(*i);break; case __number: case __string:left_child=scalar_call(*i);break; case __call_function:left_child=run_function(*i);break; case __list_search:left_child=list_search(*i);break; case __hash_search:left_child=hash_search(*i);break; case __or_operator: case __and_operator: case __add_operator: case __mul_operator: case __div_operator: case __link_operator: case __nor_operator: case __sub_operator: case __cmp_equal: case __cmp_not_equal: case __cmp_less: case __cmp_less_or_equal: case __cmp_more: case __cmp_more_or_equal:left_child=run_calculation(*i);break; default:std::cout<<">>[Runtime-error] invalid var."<get_type()) { case __id:right_child=identifier_call(*i);break; case __number: case __string:right_child=scalar_call(*i);break; case __call_function:right_child=run_function(*i);break; case __list_search:right_child=list_search(*i);break; case __hash_search:right_child=hash_search(*i);break; case __or_operator: case __and_operator: case __add_operator: case __mul_operator: case __div_operator: case __link_operator: case __nor_operator: case __sub_operator: case __cmp_equal: case __cmp_not_equal: case __cmp_less: case __cmp_less_or_equal: case __cmp_more: case __cmp_more_or_equal:right_child=run_calculation(*i);break; default:std::cout<<">>[Runtime-error] invalid var."< dynamic_para; var list_member; for(std::list::iterator i=tree.get_children().begin();i!=tree.get_children().end();++i) { switch(i->get_type()) { case __id:list_member=identifier_call(*i);break; case __number: case __string:list_member=scalar_call(*i);break; case __call_function:list_member=run_function(*i);break; case __list_search:list_member=list_search(*i);break; case __hash_search:list_member=hash_search(*i);break; case __or_operator: case __and_operator: case __add_operator: case __mul_operator: case __div_operator: case __link_operator: case __nor_operator: case __sub_operator: case __cmp_equal: case __cmp_not_equal: case __cmp_less: case __cmp_less_or_equal: case __cmp_more: case __cmp_more_or_equal:list_member=run_calculation(*i);break; default:std::cout<<">>[Runtime-error] invalid var."<::iterator i=dynamic_para.begin();i!=dynamic_para.end();++i) i->print_detail(); } scope.pop_last_scope(); return ret_var; } var nasal_runtime::list_generation(abstract_syntax_tree& tree) { var new_list; new_list.set_type(__list); return new_list; } var nasal_runtime::hash_generation(abstract_syntax_tree& tree) { var new_hash; new_hash.set_type(__hash); return new_hash; } var nasal_runtime::list_search(abstract_syntax_tree& tree) { var ret_var; return ret_var; } var nasal_runtime::hash_search(abstract_syntax_tree& tree) { var ret_var; return ret_var; } var nasal_runtime::identifier_call(abstract_syntax_tree& tree) { var ret_var; ret_var=scope.search_var(tree.get_var_name()); if(ret_var.get_type()==__null_type) return ret_var; if(ret_var.get_type()==__number) std::cout<