Delete nasal_symbol_table.h
This commit is contained in:
parent
3c79402933
commit
19fdb25242
|
@ -1,375 +0,0 @@
|
|||
#ifndef __NASAL_SYMBOL_TABLE_H__
|
||||
#define __NASAL_SYMBOL_TABLE_H__
|
||||
|
||||
struct symbol_table_unit
|
||||
{
|
||||
std::string symbol_name;
|
||||
int symbol_number;
|
||||
int symbol_line;
|
||||
symbol_table_unit()
|
||||
{
|
||||
symbol_name="";
|
||||
symbol_number=0;
|
||||
symbol_line=-1;
|
||||
return;
|
||||
}
|
||||
symbol_table_unit(const symbol_table_unit& tmp)
|
||||
{
|
||||
symbol_name=tmp.symbol_name;
|
||||
symbol_number=tmp.symbol_number;
|
||||
symbol_line=tmp.symbol_line;
|
||||
return;
|
||||
}
|
||||
symbol_table_unit& operator=(const symbol_table_unit& tmp)
|
||||
{
|
||||
symbol_line=tmp.symbol_line;
|
||||
symbol_name=tmp.symbol_name;
|
||||
symbol_number=tmp.symbol_number;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
class nasal_symbol_table
|
||||
{
|
||||
private:
|
||||
int error;
|
||||
int global_number;
|
||||
int local_number;
|
||||
std::list<symbol_table_unit> global_symbol_dictionary;// used to save symbols appeared in global scope
|
||||
std::list<symbol_table_unit> local_symbol_dictionary; // used to save symbols appeared in local scopes
|
||||
std::list<symbol_table_unit> global_scope; // global scope
|
||||
std::list<std::list<symbol_table_unit> > local_list; // local scopes
|
||||
void symbol_table_block_generate(abstract_syntax_tree&);
|
||||
void global_scope_add_symbol(symbol_table_unit);
|
||||
void local_list_add_scope();
|
||||
void local_list_del_scope();
|
||||
void local_scope_add_symbol(symbol_table_unit);
|
||||
int search_symbol_id(symbol_table_unit);
|
||||
bool search_scope(symbol_table_unit);
|
||||
public:
|
||||
nasal_symbol_table();
|
||||
~nasal_symbol_table();
|
||||
void set_scope_clear();
|
||||
void print_symbol_table();
|
||||
int get_error();
|
||||
void symbol_table_main_generate(abstract_syntax_tree&);
|
||||
};
|
||||
|
||||
nasal_symbol_table::nasal_symbol_table()
|
||||
{
|
||||
error=0;
|
||||
global_number=0;
|
||||
local_number=0;
|
||||
global_symbol_dictionary.clear();
|
||||
global_scope.clear();
|
||||
local_symbol_dictionary.clear();
|
||||
local_list.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
nasal_symbol_table::~nasal_symbol_table()
|
||||
{
|
||||
error=0;
|
||||
global_number=0;
|
||||
local_number=0;
|
||||
global_symbol_dictionary.clear();
|
||||
global_scope.clear();
|
||||
local_symbol_dictionary.clear();
|
||||
local_list.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::set_scope_clear()
|
||||
{
|
||||
error=0;
|
||||
global_number=0;
|
||||
local_number=0;
|
||||
global_symbol_dictionary.clear();
|
||||
global_scope.clear();
|
||||
local_symbol_dictionary.clear();
|
||||
local_list.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::print_symbol_table()
|
||||
{
|
||||
if(!global_symbol_dictionary.empty())
|
||||
{
|
||||
std::cout<<">> [Symbol] global scope:"<<std::endl;
|
||||
for(std::list<symbol_table_unit>::iterator i=global_symbol_dictionary.begin();i!=global_symbol_dictionary.end();++i)
|
||||
std::cout<<" line "<<i->symbol_line<<": "<<i->symbol_name<<"|"<<i->symbol_number<<std::endl;
|
||||
}
|
||||
else
|
||||
std::cout<<">> [Symbol] empty global symbol list."<<std::endl;
|
||||
if(!local_symbol_dictionary.empty())
|
||||
{
|
||||
std::cout<<">>[Symbol] local scope:"<<std::endl;
|
||||
for(std::list<symbol_table_unit>::iterator i=local_symbol_dictionary.begin();i!=local_symbol_dictionary.end();++i)
|
||||
std::cout<<" line "<<i->symbol_line<<": "<<i->symbol_name<<"|"<<i->symbol_number<<std::endl;
|
||||
}
|
||||
else
|
||||
std::cout<<">> [Symbol] empty local symbol list."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::global_scope_add_symbol(symbol_table_unit tmp)
|
||||
{
|
||||
// this conditional expression is used to avoid wrong use of this function
|
||||
// repeat symbol will get the same number
|
||||
for(std::list<symbol_table_unit>::iterator i=global_scope.begin();i!=global_scope.end();++i)
|
||||
if(i->symbol_name==tmp.symbol_name)
|
||||
return;
|
||||
++global_number;
|
||||
tmp.symbol_number=global_number;
|
||||
global_scope.push_back(tmp);
|
||||
global_symbol_dictionary.push_back(tmp);
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::local_list_add_scope()
|
||||
{
|
||||
std::list<symbol_table_unit> new_scope;
|
||||
local_list.push_back(new_scope);
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::local_list_del_scope()
|
||||
{
|
||||
if(local_list.empty())
|
||||
{
|
||||
++error;
|
||||
std::cout<<">> [Symbol-error] fatal error: empty block_scope_list."<<std::endl;
|
||||
}
|
||||
else
|
||||
local_list.pop_back();
|
||||
|
||||
if(local_list.empty())
|
||||
local_number=0;
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::local_scope_add_symbol(symbol_table_unit tmp)
|
||||
{
|
||||
if(!local_list.empty())
|
||||
{
|
||||
// if in the last scope there is a sym which symbol_name is the same as tmp.symbol_name
|
||||
// then the symbol will get the same number
|
||||
std::list<std::list<symbol_table_unit> >::iterator last_scope=local_list.end();--last_scope;
|
||||
for(std::list<std::list<symbol_table_unit> >::iterator i=local_list.begin();i!=local_list.end();++i)
|
||||
for(std::list<symbol_table_unit>::iterator j=i->begin();j!=i->end();++j)
|
||||
if((i==last_scope) && (j->symbol_name==tmp.symbol_name))
|
||||
return;
|
||||
++local_number;
|
||||
tmp.symbol_number=local_number;
|
||||
local_list.back().push_back(tmp);
|
||||
local_symbol_dictionary.push_back(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
++error;
|
||||
std::cout<<">> [Symbol-error] fatal error: empty block_scope_list."<<std::endl;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int nasal_symbol_table::search_symbol_id(symbol_table_unit tmp)
|
||||
{
|
||||
// local scope
|
||||
for(std::list<std::list<symbol_table_unit> >::iterator i=local_list.begin();i!=local_list.end();++i)
|
||||
for(std::list<symbol_table_unit>::iterator j=i->begin();j!=i->end();++j)
|
||||
if(j->symbol_name==tmp.symbol_name)
|
||||
return j->symbol_number;
|
||||
// global scope
|
||||
for(std::list<symbol_table_unit>::iterator i=global_scope.begin();i!=global_scope.end();++i)
|
||||
if(i->symbol_name==tmp.symbol_name)
|
||||
return i->symbol_number;
|
||||
// error
|
||||
++error;
|
||||
std::cout<<">> [Symbol-error] line "<<tmp.symbol_line<<": cannot find var named \'"<<tmp.symbol_name<<"\' ."<<std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool nasal_symbol_table::search_scope(symbol_table_unit tmp)
|
||||
{
|
||||
// this function must be used when search_symbol_id()!=-1
|
||||
// because if seach_symbol_id()==-1 it means it haven't found this symbol
|
||||
// true means global scope
|
||||
// false means local scope
|
||||
for(std::list<std::list<symbol_table_unit> >::iterator i=local_list.begin();i!=local_list.end();++i)
|
||||
for(std::list<symbol_table_unit>::iterator j=i->begin();j!=i->end();++j)
|
||||
if(j->symbol_name==tmp.symbol_name)
|
||||
return false;
|
||||
for(std::list<symbol_table_unit>::iterator i=global_scope.begin();i!=global_scope.end();++i)
|
||||
if(i->symbol_name==tmp.symbol_name)
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
int nasal_symbol_table::get_error()
|
||||
{
|
||||
// god knows why i wrote this sh*t.
|
||||
return error;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::symbol_table_main_generate(abstract_syntax_tree& root)
|
||||
{
|
||||
this->set_scope_clear();
|
||||
for(std::list<abstract_syntax_tree>::iterator i=root.get_children().begin();i!=root.get_children().end();++i)
|
||||
{
|
||||
// only definition will call this->global_scope_add_symbol(symbol_table_unit)
|
||||
if(i->get_node_type()==__definition)
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_children().front().get_node_line();
|
||||
tmp.symbol_name=i->get_children().front().get_var_name();
|
||||
this->global_scope_add_symbol(tmp);
|
||||
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->get_children().front().set_var_scope(this->search_scope(tmp));
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
}
|
||||
// when in main_generate loop,local scope is totally empty
|
||||
else
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
std::cout<<">> [Symbol] symbol table generating complete. "<<error<<" error(s)."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
void nasal_symbol_table::symbol_table_block_generate(abstract_syntax_tree& node)
|
||||
{
|
||||
int node_type=node.get_node_type();
|
||||
if(node_type==__function)
|
||||
{
|
||||
this->local_list_add_scope();
|
||||
if(node.get_children().front().get_node_type()==__parameters)
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().front().get_children().begin();i!=node.get_children().front().get_children().end();++i)
|
||||
{
|
||||
if(i->get_node_type()==__id || i->get_node_type()==__dynamic_id)
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_node_line();
|
||||
tmp.symbol_name=i->get_var_name();
|
||||
this->local_scope_add_symbol(tmp);
|
||||
i->set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->set_var_scope(this->search_scope(tmp));
|
||||
}
|
||||
else
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_children().front().get_node_line();
|
||||
tmp.symbol_name=i->get_children().front().get_var_name();
|
||||
this->local_scope_add_symbol(tmp);
|
||||
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->get_children().front().set_var_scope(this->search_scope(tmp));
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
}
|
||||
}
|
||||
this->symbol_table_block_generate(node.get_children().back());
|
||||
this->local_list_del_scope();
|
||||
}
|
||||
else if(node_type==__conditional)
|
||||
{
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
{
|
||||
this->local_list_add_scope();
|
||||
if(i->get_node_type()==__if || i->get_node_type()==__elsif)
|
||||
this->symbol_table_block_generate(i->get_children().front());
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
this->local_list_del_scope();
|
||||
}
|
||||
}
|
||||
else if(node_type==__while)
|
||||
{
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
else if(node_type==__for || node_type==__foreach || node_type==__forindex)
|
||||
{
|
||||
this->local_list_add_scope();
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
{
|
||||
if(i->get_node_type()==__definition)
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_children().front().get_node_line();
|
||||
tmp.symbol_name=i->get_children().front().get_var_name();
|
||||
this->local_scope_add_symbol(tmp);
|
||||
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->get_children().front().set_var_scope(this->search_scope(tmp));
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
}
|
||||
else
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
this->local_list_del_scope();
|
||||
}
|
||||
else if(node_type==__normal_statement_block)
|
||||
{
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
{
|
||||
if(i->get_node_type()==__definition)
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_children().front().get_node_line();
|
||||
tmp.symbol_name=i->get_children().front().get_var_name();
|
||||
this->local_scope_add_symbol(tmp);
|
||||
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->get_children().front().set_var_scope(this->search_scope(tmp));
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
}
|
||||
else
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
}
|
||||
else if((node_type==__id) || (node_type==__call_hash))
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=node.get_node_line();
|
||||
tmp.symbol_name=node.get_var_name();
|
||||
int id_symbol_number=this->search_symbol_id(tmp);
|
||||
node.set_symbol_number(id_symbol_number);
|
||||
// if this id does not exist in scopes
|
||||
// then search_scope will not be called
|
||||
if(id_symbol_number>0)
|
||||
node.set_var_scope(this->search_scope(tmp));
|
||||
if(!node.get_children().empty())
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
else if(node_type==__hash)
|
||||
{
|
||||
this->local_list_add_scope();
|
||||
symbol_table_unit me;
|
||||
me.symbol_line=node.get_node_line();
|
||||
me.symbol_name="me";
|
||||
this->local_scope_add_symbol(me);
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
{
|
||||
if(i->get_node_type()==__hash_member)
|
||||
{
|
||||
symbol_table_unit tmp;
|
||||
tmp.symbol_line=i->get_children().front().get_node_line();
|
||||
if(i->get_children().front().get_node_type()==__id)
|
||||
tmp.symbol_name=i->get_children().front().get_var_name();
|
||||
else if(i->get_children().front().get_node_type()==__string)
|
||||
tmp.symbol_name=i->get_children().front().get_var_string();
|
||||
this->local_scope_add_symbol(tmp);
|
||||
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
|
||||
i->get_children().front().set_var_scope(this->search_scope(tmp));
|
||||
this->symbol_table_block_generate(i->get_children().back());
|
||||
}
|
||||
else
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
this->local_list_del_scope();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!node.get_children().empty())
|
||||
for(std::list<abstract_syntax_tree>::iterator i=node.get_children().begin();i!=node.get_children().end();++i)
|
||||
this->symbol_table_block_generate(*i);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue