diff --git a/version1.0/nasal.h b/version1.0/nasal.h index 73cc2d4..e8151e6 100644 --- a/version1.0/nasal.h +++ b/version1.0/nasal.h @@ -11,6 +11,7 @@ #include "nasal_token_type.h" #include "abstract_syntax_tree.h" #include "nasal_var.h" +#include "nasal_var_inrun_list.h" #include "nasal_lexer.h" #include "nasal_parser.h" diff --git a/version1.0/nasal_var.cpp b/version1.0/nasal_var.cpp index e2cce7e..7c17c50 100644 --- a/version1.0/nasal_var.cpp +++ b/version1.0/nasal_var.cpp @@ -15,6 +15,7 @@ var::var(const var& temp) case var_string:ptr=new std::string;*((std::string*)ptr)=*((std::string*)temp.ptr);break; case var_list:ptr=new nasal_list;*((nasal_list*)ptr)=*((nasal_list*)temp.ptr);break; case var_hash:ptr=new nasal_hash;*((nasal_hash*)ptr)=*((nasal_hash*)temp.ptr);break; + case var_function:ptr=new nasal_function;*((nasal_function*)ptr)=*((nasal_function*)temp.ptr);break; } type=temp.type; } @@ -27,8 +28,35 @@ var::~var() case var_string:delete (std::string*)ptr;break; case var_list:delete (nasal_list*)ptr;break; case var_hash:delete (nasal_hash*)ptr;break; + case var_function:delete (nasal_function*)ptr;break; } } +var& var::operator=(const var& temp) +{ + if(ptr) + { + switch(type) + { + case var_null:break; + case var_number:delete (double*)ptr;break; + case var_string:delete (std::string*)ptr;break; + case var_list:delete (nasal_list*)ptr;break; + case var_hash:delete (nasal_hash*)ptr;break; + case var_function:delete (nasal_function*)ptr;break; + } + } + switch(temp.type) + { + case var_null:ptr=NULL;break; + case var_number:ptr=new double;*((double*)ptr)=*((double*)temp.ptr);break; + case var_string:ptr=new std::string;*((std::string*)ptr)=*((std::string*)temp.ptr);break; + case var_list:ptr=new nasal_list;*((nasal_list*)ptr)=*((nasal_list*)temp.ptr);break; + case var_hash:ptr=new nasal_hash;*((nasal_hash*)ptr)=*((nasal_hash*)temp.ptr);break; + case var_function:ptr=new nasal_function;*((nasal_function*)ptr)=*((nasal_function*)temp.ptr);break; + } + type=temp.type; + return *this; +} nasal_list::nasal_list() { diff --git a/version1.0/nasal_var.h b/version1.0/nasal_var.h index 3695d39..31d3b0b 100644 --- a/version1.0/nasal_var.h +++ b/version1.0/nasal_var.h @@ -26,6 +26,7 @@ class var var(); var(const var&); ~var(); + var& operator=(const var& temp); }; class nasal_list diff --git a/version1.0/nasal_var_inrun_list.h b/version1.0/nasal_var_inrun_list.h new file mode 100644 index 0000000..5a9cd7e --- /dev/null +++ b/version1.0/nasal_var_inrun_list.h @@ -0,0 +1,77 @@ +#ifndef __NASAL_VAR_INRUN_STACK_H__ +#define __NASAL_VAR_INRUN_STACK_H__ + +struct var_list_unit +{ + std::string var_name; + int num_place; +}; + +class nasal_var_map +{ + private: + std::list var_list; + int var_number; + public: + nasal_var_map() + { + var_list.clear(); + var_number=0; + } + void add_var(std::string& __str) + { + var_list_unit t; + t.var_name=__str; + for(std::list::iterator i=var_list.begin();i!=var_list.end();++i) + { + if(i->var_name==__str) + return; + } + ++var_number; + t.num_place=var_number; + var_list.push_back(t); + return; + } + int return_last_var_num_place() + { + std::list::iterator i=var_list.end(); + --i; + return i->num_place; + } + void print_all_var() + { + for(std::list::iterator i=var_list.begin();i!=var_list.end();++i) + std::cout<var_name<<": "<num_place< var_list; + public: + void in_run_add_var(var& varia,int number,bool is_global) + { + in_run_list_unit t; + t.variable=varia; + t.num_place=number; + t.global=is_global; + var_list.push_back(t); + return; + } + void delete_last_var() + { + var_list.pop_back(); + return; + } +}; + +#endif