This commit is contained in:
Valk Richard Li 2020-01-31 17:55:17 +08:00 committed by GitHub
parent 6f12a2d0d4
commit c0147bcdfa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 100 additions and 8 deletions

View File

@ -7,6 +7,7 @@ class abstract_syntax_tree
// basic elements // basic elements
int line; int line;
int symbol_number; int symbol_number;
bool symbol_is_global;
int node_type; int node_type;
std::list<abstract_syntax_tree> children; std::list<abstract_syntax_tree> children;
@ -35,6 +36,7 @@ class abstract_syntax_tree
void set_var_string(std::string); void set_var_string(std::string);
void set_var_number(std::string); void set_var_number(std::string);
void set_var_name(std::string); void set_var_name(std::string);
void set_var_scope(bool);// true means it exists in global scope
void add_children(abstract_syntax_tree); void add_children(abstract_syntax_tree);
// get // get
@ -44,6 +46,7 @@ class abstract_syntax_tree
double get_var_number(); double get_var_number();
std::string get_var_string(); std::string get_var_string();
std::string get_var_name(); std::string get_var_name();
bool get_var_scope();
std::list<abstract_syntax_tree>& get_children(); std::list<abstract_syntax_tree>& get_children();
}; };
@ -52,6 +55,7 @@ abstract_syntax_tree::abstract_syntax_tree()
node_type=__null_type; node_type=__null_type;
line=0; line=0;
symbol_number=-1; symbol_number=-1;
symbol_is_global=false;
var_number=0; var_number=0;
var_string=""; var_string="";
var_name=""; var_name="";
@ -64,6 +68,7 @@ abstract_syntax_tree::abstract_syntax_tree(const abstract_syntax_tree& tmp)
node_type=tmp.node_type; node_type=tmp.node_type;
line=tmp.line; line=tmp.line;
symbol_number=tmp.symbol_number; symbol_number=tmp.symbol_number;
symbol_is_global=tmp.symbol_is_global;
var_number=tmp.var_number; var_number=tmp.var_number;
var_string=tmp.var_string; var_string=tmp.var_string;
var_name=tmp.var_name; var_name=tmp.var_name;
@ -82,6 +87,7 @@ abstract_syntax_tree& abstract_syntax_tree::operator=(const abstract_syntax_tree
node_type=tmp.node_type; node_type=tmp.node_type;
line=tmp.line; line=tmp.line;
symbol_number=tmp.symbol_number; symbol_number=tmp.symbol_number;
symbol_is_global=tmp.symbol_is_global;
var_number=tmp.var_number; var_number=tmp.var_number;
var_string=tmp.var_string; var_string=tmp.var_string;
var_name=tmp.var_name; var_name=tmp.var_name;
@ -105,7 +111,7 @@ void abstract_syntax_tree::print_tree(const int n)
case __dynamic_id: case __dynamic_id:
case __call_vector: case __call_vector:
case __call_hash: case __call_hash:
case __call_function:std::cout<<": "<<var_name;break; case __call_function:std::cout<<": "<<var_name<<" (sym_num: "<<symbol_number<<"("<<(symbol_is_global? "global":"local")<<"))";break;
} }
std::cout<<std::endl; std::cout<<std::endl;
if(!children.empty()) if(!children.empty())
@ -170,6 +176,12 @@ void abstract_syntax_tree::set_var_name(std::string __str)
return; return;
} }
void abstract_syntax_tree::set_var_scope(bool is_global)
{
symbol_is_global=is_global;
return;
}
void abstract_syntax_tree::add_children(abstract_syntax_tree p) void abstract_syntax_tree::add_children(abstract_syntax_tree p)
{ {
// use abstract_syntax_tree instead of abstract_syntax_tree& // use abstract_syntax_tree instead of abstract_syntax_tree&
@ -209,6 +221,11 @@ std::string abstract_syntax_tree::get_var_name()
return var_name; return var_name;
} }
bool abstract_syntax_tree::get_var_scope()
{
return symbol_is_global;
}
std::list<abstract_syntax_tree>& abstract_syntax_tree::get_children() std::list<abstract_syntax_tree>& abstract_syntax_tree::get_children()
{ {
return children; return children;

View File

@ -106,7 +106,11 @@ int main()
parser.get_token_list(lexer.get_detail_token_list()); parser.get_token_list(lexer.get_detail_token_list());
parser.main_generate(); parser.main_generate();
if(!parser.get_error()) if(!parser.get_error())
{
symtable.set_scope_clear();
symtable.symbol_table_main_generate(parser.get_root());
parser.get_root().print_tree(1); parser.get_root().print_tree(1);
}
else else
std::cout<<">>[Parse] error occurred,stop."<<std::endl; std::cout<<">>[Parse] error occurred,stop."<<std::endl;
} }
@ -125,9 +129,8 @@ int main()
{ {
symtable.set_scope_clear(); symtable.set_scope_clear();
symtable.symbol_table_main_generate(parser.get_root()); symtable.symbol_table_main_generate(parser.get_root());
if(!symtable.get_error()) symtable.print_symbol_table();
symtable.print_symbol_table(); if(symtable.get_error())
else
std::cout<<">>[Symbol] error occurred,stop."<<std::endl; std::cout<<">>[Symbol] error occurred,stop."<<std::endl;
} }
else else

View File

@ -213,6 +213,7 @@ void nasal_symbol_table::symbol_table_main_generate(abstract_syntax_tree& root)
tmp.symbol_name=i->get_children().front().get_var_name(); tmp.symbol_name=i->get_children().front().get_var_name();
this->global_scope_add_symbol(tmp); this->global_scope_add_symbol(tmp);
i->get_children().front().set_symbol_number(this->search_symbol_id(tmp)); i->get_children().front().set_symbol_number(this->search_symbol_id(tmp));
i->get_children().front().set_var_scope(true);
this->symbol_table_block_generate(i->get_children().back()); this->symbol_table_block_generate(i->get_children().back());
} }
else else
@ -227,16 +228,60 @@ void nasal_symbol_table::symbol_table_block_generate(abstract_syntax_tree& node)
if(node.get_node_type()==__function) if(node.get_node_type()==__function)
{ {
this->local_list_add_scope(); 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(false);
}
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(false);
this->symbol_table_block_generate(i->get_children().back());
}
}
this->symbol_table_block_generate(node.get_children().back());
this->local_list_del_scope(); this->local_list_del_scope();
} }
else if(node.get_node_type()==__conditional) else if(node.get_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.get_node_type()==__normal_statement_block) else if(node.get_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(false);
this->symbol_table_block_generate(i->get_children().back());
}
else
this->symbol_table_block_generate(*i);
}
} }
else if(node.get_node_type()==__id) else if(node.get_node_type()==__id)
{ {
@ -246,6 +291,33 @@ void nasal_symbol_table::symbol_table_block_generate(abstract_syntax_tree& node)
int id_symbol_number=this->search_symbol_id(tmp); int id_symbol_number=this->search_symbol_id(tmp);
node.set_symbol_number(id_symbol_number); node.set_symbol_number(id_symbol_number);
} }
else if(node.get_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(false);
this->symbol_table_block_generate(i->get_children().back());
}
else
this->symbol_table_block_generate(*i);
}
this->local_list_del_scope();
}
else else
{ {
if(!node.get_children().empty()) if(!node.get_children().empty())
@ -255,4 +327,4 @@ void nasal_symbol_table::symbol_table_block_generate(abstract_syntax_tree& node)
return; return;
} }
#endif #endif