This commit is contained in:
Valk Richard Li
2020-02-15 16:35:36 +08:00
committed by GitHub
parent 19fdb25242
commit a03d8a440d
8 changed files with 673 additions and 45 deletions

View File

@@ -5,8 +5,7 @@ nasal_lexer lexer;
nasal_parse parser;
abstract_syntax_tree libroot;
abstract_syntax_tree root;
nasal_symbol_table symtable;
abstract_syntax_tree linker;
std::string command;
@@ -40,7 +39,6 @@ int main()
std::cout<<">> [lex ] turn code into tokens."<<std::endl;
std::cout<<">> [par ] turn tokens into abstract syntax tree."<<std::endl;
std::cout<<">> [ast ] check the abstract syntax tree."<<std::endl;
std::cout<<">> [sym ] generate symbol table and print the information of it."<<std::endl;
std::cout<<">> [run ] run code."<<std::endl;
std::cout<<">> [info ] print lexer,parser and ast on screen."<<std::endl;
std::cout<<">> [exit ] quit nasal interpreter."<<std::endl;
@@ -62,8 +60,8 @@ int main()
resource.delete_all_source();
lexer.delete_all_tokens();
parser.delete_all_elements();
symtable.set_scope_clear();
root.set_clear();
linker.set_clear();
std::cout<<">> [Delete] complete."<<std::endl;
}
else if(command=="lib")
@@ -82,14 +80,13 @@ int main()
std::cout<<">> [Lib] loaded."<<std::endl;
}
else
std::cout<<">> [Lib-error] lib files have parse error(s),stop."<<std::endl;
std::cout<<">> [Lib] lib files have parse error(s),stop."<<std::endl;
}
else
std::cout<<">> [Lib-error] lib files have lexer error(s),stop."<<std::endl;
std::cout<<">> [Lib] lib files have lexer error(s),stop."<<std::endl;
resource.delete_all_source();
lexer.delete_all_tokens();
parser.delete_all_elements();
symtable.set_scope_clear();
}
else if(command=="rs")
{
@@ -126,33 +123,7 @@ int main()
parser.get_token_list(lexer.get_detail_token_list());
parser.main_generate();
if(!parser.get_error())
{
symtable.set_scope_clear();
symtable.symbol_table_main_generate(parser.get_root());
parser.get_root().print_tree();
}
else
std::cout<<">> [Parse] error occurred,stop."<<std::endl;
}
else
std::cout<<">> [Lexer] error occurred,stop."<<std::endl;
}
else if(command=="sym")
{
lexer.scanner(resource.get_source());
lexer.generate_detail_token();
if(!lexer.get_error())
{
parser.get_token_list(lexer.get_detail_token_list());
parser.main_generate();
if(!parser.get_error())
{
symtable.set_scope_clear();
symtable.symbol_table_main_generate(parser.get_root());
symtable.print_symbol_table();
if(symtable.get_error())
std::cout<<">> [Symbol] error occurred,stop."<<std::endl;
}
else
std::cout<<">> [Parse] error occurred,stop."<<std::endl;
}
@@ -169,12 +140,11 @@ int main()
parser.main_generate();
if(!parser.get_error())
{
symtable.set_scope_clear();
symtable.symbol_table_main_generate(parser.get_root());
if(!symtable.get_error())
root=parser.get_root();// run code
else
std::cout<<">> [Symbol] error occurred,stop."<<std::endl;
linker.set_clear();
linker=libroot;
linker.merge_children(parser.get_root());
root=linker;
root.print_tree();
}
else
std::cout<<">> [Parse] error occurred,stop."<<std::endl;