Add framework for in_run
This commit is contained in:
parent
40148872af
commit
95ca60644d
|
@ -11,6 +11,7 @@
|
||||||
#include "nasal_token_type.h"
|
#include "nasal_token_type.h"
|
||||||
#include "abstract_syntax_tree.h"
|
#include "abstract_syntax_tree.h"
|
||||||
#include "nasal_var.h"
|
#include "nasal_var.h"
|
||||||
|
#include "nasal_var_inrun_list.h"
|
||||||
|
|
||||||
#include "nasal_lexer.h"
|
#include "nasal_lexer.h"
|
||||||
#include "nasal_parser.h"
|
#include "nasal_parser.h"
|
||||||
|
|
|
@ -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_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_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_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;
|
type=temp.type;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +28,35 @@ var::~var()
|
||||||
case var_string:delete (std::string*)ptr;break;
|
case var_string:delete (std::string*)ptr;break;
|
||||||
case var_list:delete (nasal_list*)ptr;break;
|
case var_list:delete (nasal_list*)ptr;break;
|
||||||
case var_hash:delete (nasal_hash*)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()
|
nasal_list::nasal_list()
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@ class var
|
||||||
var();
|
var();
|
||||||
var(const var&);
|
var(const var&);
|
||||||
~var();
|
~var();
|
||||||
|
var& operator=(const var& temp);
|
||||||
};
|
};
|
||||||
|
|
||||||
class nasal_list
|
class nasal_list
|
||||||
|
|
|
@ -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_unit> 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<var_list_unit>::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<var_list_unit>::iterator i=var_list.end();
|
||||||
|
--i;
|
||||||
|
return i->num_place;
|
||||||
|
}
|
||||||
|
void print_all_var()
|
||||||
|
{
|
||||||
|
for(std::list<var_list_unit>::iterator i=var_list.begin();i!=var_list.end();++i)
|
||||||
|
std::cout<<i->var_name<<": "<<i->num_place<<std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct in_run_list_unit
|
||||||
|
{
|
||||||
|
var variable;
|
||||||
|
int num_place;
|
||||||
|
bool global;
|
||||||
|
};
|
||||||
|
|
||||||
|
class in_run_list
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::list<in_run_list_unit> 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
|
Loading…
Reference in New Issue