change some names of identifiers

This commit is contained in:
Valk Richard Li 2019-12-25 13:47:57 +08:00 committed by GitHub
parent 3325416b10
commit 2387fe764d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 120 additions and 117 deletions

View File

@ -1,6 +1,6 @@
#include "nasal.h"
resource_file res;
resource_file resource;
nasal_lexer lexer;
nasal_parse parser;
@ -36,25 +36,25 @@ int main()
}
else if(command=="del")
{
res.delete_all_source();
resource.delete_all_source();
std::cout<<">>[Delete] complete."<<std::endl;
}
else if(command=="lib")
{
res.load_lib_file();
resource.load_lib_file();
std::cout<<">>[Lib] loaded."<<std::endl;
}
else if(command=="rs")
{
res.print_resource(false);
resource.print_resource(false);
}
else if(command=="total")
{
res.print_resource(true);
resource.print_resource(true);
}
else if(command=="lexer")
{
lexer.scanner(res.get_source());
lexer.scanner(resource.get_source());
lexer.generate_detail_token();
if(!lexer.get_error())
lexer.print_token_list();
@ -63,11 +63,11 @@ int main()
}
else if(command=="parser")
{
lexer.scanner(res.get_source());
lexer.scanner(resource.get_source());
lexer.generate_detail_token();
if(!lexer.get_error())
{
parser.get_token_list(lexer.get_detail_token());
parser.get_token_list(lexer.get_detail_token_list());
parser.print_detail_token();
parser.main_generate();
}
@ -76,11 +76,11 @@ int main()
}
else if(command=="ast")
{
lexer.scanner(res.get_source());
lexer.scanner(resource.get_source());
lexer.generate_detail_token();
if(!lexer.get_error())
{
parser.get_token_list(lexer.get_detail_token());
parser.get_token_list(lexer.get_detail_token_list());
parser.main_generate();
if(!parser.get_error())
parser.get_root().print_tree(1);
@ -93,7 +93,7 @@ int main()
else if(command=="exit")
break;
else
res.input_file(command);
resource.input_file(command);
}
return 0;
}

View File

@ -52,7 +52,7 @@ class resource_file
private:
std::list<char> libsource;
std::list<char> resource;
std::list<char> total;
std::list<char> totalcode;
public:
/*
resource_file();
@ -67,21 +67,21 @@ class resource_file
{
libsource.clear();
resource.clear();
total.clear();
totalcode.clear();
return;
}
~resource_file()
{
libsource.clear();
resource.clear();
total.clear();
totalcode.clear();
return;
}
void delete_all_source()
{
libsource.clear();
resource.clear();
total.clear();
totalcode.clear();
return;
}
void input_file(std::string filename)
@ -107,16 +107,19 @@ class resource_file
void load_lib_file()
{
libsource.clear();
/*
ifstream lib files here
*/
return;
}
std::list<char>& get_source()
{
total.clear();
totalcode.clear();
for(std::list<char>::iterator i=libsource.begin();i!=libsource.end();++i)
total.push_back(*i);
totalcode.push_back(*i);
for(std::list<char>::iterator i=resource.begin();i!=resource.end();++i)
total.push_back(*i);
return total;
totalcode.push_back(*i);
return totalcode;
}
void print_resource(bool withlib)
{
@ -157,7 +160,7 @@ class nasal_lexer
{
private:
std::list<token> token_list;
std::list<token> detail_token;
std::list<token> detail_token_list;
int error;
public:
/*
@ -172,14 +175,14 @@ class nasal_lexer
nasal_lexer()
{
token_list.clear();
detail_token.clear();
detail_token_list.clear();
error=0;
return;
}
~nasal_lexer()
{
token_list.clear();
detail_token.clear();
detail_token_list.clear();
return;
}
void print_token_list()
@ -195,7 +198,7 @@ class nasal_lexer
void scanner(std::list<char>& res)
{
token_list.clear();
detail_token.clear();
detail_token_list.clear();
error=0;
int line=1;
@ -365,107 +368,107 @@ class nasal_lexer
}
void generate_detail_token()
{
token detail;
detail_token.clear();
token detail_token;
detail_token_list.clear();
for(std::list<token>::iterator i=token_list.begin();i!=token_list.end();++i)
{
if(i->type==__token_number)
{
detail.line=i->line;
detail.str =i->str;
detail.type=__number;
detail_token.push_back(detail);
detail_token.line=i->line;
detail_token.str =i->str;
detail_token.type=__number;
detail_token_list.push_back(detail_token);
}
else if(i->type==__token_string)
{
detail.line=i->line;
detail.str =i->str;
detail.type=__string;
detail_token.push_back(detail);
detail_token.line=i->line;
detail_token.str =i->str;
detail_token.type=__string;
detail_token_list.push_back(detail_token);
}
else if(i->type==__token_reserve_word)
{
detail.line=i->line;
detail.str ="";
if(i->str=="for") detail.type=__for;
else if(i->str=="foreach") detail.type=__foreach;
else if(i->str=="forindex") detail.type=__forindex;
else if(i->str=="while") detail.type=__while;
else if(i->str=="var") detail.type=__var;
else if(i->str=="func") detail.type=__func;
else if(i->str=="break") detail.type=__break;
else if(i->str=="continue") detail.type=__continue;
else if(i->str=="return") detail.type=__return;
else if(i->str=="if") detail.type=__if;
else if(i->str=="else") detail.type=__else;
else if(i->str=="elsif") detail.type=__elsif;
else if(i->str=="nil") detail.type=__nil;
else if(i->str=="and") detail.type=__and_operator;
else if(i->str=="or") detail.type=__or_operator;
detail_token.push_back(detail);
detail_token.line=i->line;
detail_token.str ="";
if(i->str=="for") detail_token.type=__for;
else if(i->str=="foreach") detail_token.type=__foreach;
else if(i->str=="forindex") detail_token.type=__forindex;
else if(i->str=="while") detail_token.type=__while;
else if(i->str=="var") detail_token.type=__var;
else if(i->str=="func") detail_token.type=__func;
else if(i->str=="break") detail_token.type=__break;
else if(i->str=="continue") detail_token.type=__continue;
else if(i->str=="return") detail_token.type=__return;
else if(i->str=="if") detail_token.type=__if;
else if(i->str=="else") detail_token.type=__else;
else if(i->str=="elsif") detail_token.type=__elsif;
else if(i->str=="nil") detail_token.type=__nil;
else if(i->str=="and") detail_token.type=__and_operator;
else if(i->str=="or") detail_token.type=__or_operator;
detail_token_list.push_back(detail_token);
}
else if(i->type==__token_identifier)
{
detail.line=i->line;
detail.str =i->str;
detail_token.line=i->line;
detail_token.str =i->str;
if(i->str.length()<=3)
detail.type=__id;
detail_token.type=__id;
else
{
std::string tempstr=i->str;
int strback=tempstr.length()-1;
if(tempstr.length()>3 &&tempstr[strback]=='.' && tempstr[strback-1]=='.' && tempstr[strback-2]=='.')
{
detail.str="";
detail_token.str="";
for(int j=0;j<tempstr.length()-3;++j)
detail.str+=tempstr[j];
detail.type=__dynamic_id;
detail_token.str+=tempstr[j];
detail_token.type=__dynamic_id;
}
else
detail.type=__id;
detail_token.type=__id;
}
detail_token.push_back(detail);
detail_token_list.push_back(detail_token);
}
else if(i->type==__token_operator)
{
detail.line=i->line;
detail.str ="";
if(i->str=="+") detail.type=__add_operator;
else if(i->str=="-") detail.type=__sub_operator;
else if(i->str=="*") detail.type=__mul_operator;
else if(i->str=="/") detail.type=__div_operator;
else if(i->str=="~") detail.type=__link_operator;
else if(i->str=="+=") detail.type=__add_equal;
else if(i->str=="-=") detail.type=__sub_equal;
else if(i->str=="*=") detail.type=__mul_equal;
else if(i->str=="/=") detail.type=__div_equal;
else if(i->str=="~=") detail.type=__link_equal;
else if(i->str=="=") detail.type=__equal;
else if(i->str=="==") detail.type=__cmp_equal;
else if(i->str=="!=") detail.type=__cmp_not_equal;
else if(i->str=="<") detail.type=__cmp_less;
else if(i->str=="<=") detail.type=__cmp_less_or_equal;
else if(i->str==">") detail.type=__cmp_more;
else if(i->str==">=") detail.type=__cmp_more_or_equal;
else if(i->str==";") detail.type=__semi;
else if(i->str==".") detail.type=__dot;
else if(i->str==":") detail.type=__colon;
else if(i->str==",") detail.type=__comma;
else if(i->str=="?") detail.type=__ques_mark;
else if(i->str=="!") detail.type=__nor_operator;
else if(i->str=="[") detail.type=__left_bracket;
else if(i->str=="]") detail.type=__right_bracket;
else if(i->str=="(") detail.type=__left_curve;
else if(i->str==")") detail.type=__right_curve;
else if(i->str=="{") detail.type=__left_brace;
else if(i->str=="}") detail.type=__right_brace;
detail_token.line=i->line;
detail_token.str ="";
if(i->str=="+") detail_token.type=__add_operator;
else if(i->str=="-") detail_token.type=__sub_operator;
else if(i->str=="*") detail_token.type=__mul_operator;
else if(i->str=="/") detail_token.type=__div_operator;
else if(i->str=="~") detail_token.type=__link_operator;
else if(i->str=="+=") detail_token.type=__add_equal;
else if(i->str=="-=") detail_token.type=__sub_equal;
else if(i->str=="*=") detail_token.type=__mul_equal;
else if(i->str=="/=") detail_token.type=__div_equal;
else if(i->str=="~=") detail_token.type=__link_equal;
else if(i->str=="=") detail_token.type=__equal;
else if(i->str=="==") detail_token.type=__cmp_equal;
else if(i->str=="!=") detail_token.type=__cmp_not_equal;
else if(i->str=="<") detail_token.type=__cmp_less;
else if(i->str=="<=") detail_token.type=__cmp_less_or_equal;
else if(i->str==">") detail_token.type=__cmp_more;
else if(i->str==">=") detail_token.type=__cmp_more_or_equal;
else if(i->str==";") detail_token.type=__semi;
else if(i->str==".") detail_token.type=__dot;
else if(i->str==":") detail_token.type=__colon;
else if(i->str==",") detail_token.type=__comma;
else if(i->str=="?") detail_token.type=__ques_mark;
else if(i->str=="!") detail_token.type=__nor_operator;
else if(i->str=="[") detail_token.type=__left_bracket;
else if(i->str=="]") detail_token.type=__right_bracket;
else if(i->str=="(") detail_token.type=__left_curve;
else if(i->str==")") detail_token.type=__right_curve;
else if(i->str=="{") detail_token.type=__left_brace;
else if(i->str=="}") detail_token.type=__right_brace;
else
{
++error;
std::cout<<">>[Lexer-error] line "<<detail.line<<": unknown operator \'"<<i->str<<"\'."<<std::endl;
detail.type=__unknown_operator;
std::cout<<">>[Lexer-error] line "<<detail_token.line<<": unknown operator \'"<<i->str<<"\'."<<std::endl;
detail_token.type=__unknown_operator;
}
detail_token.push_back(detail);
detail_token_list.push_back(detail_token);
}
}
std::cout<<">>[Detail-Lexer] complete generating. "<<error<<" error(s)."<<std::endl;
@ -475,9 +478,9 @@ class nasal_lexer
{
return error;
}
std::list<token>& get_detail_token()
std::list<token>& get_detail_token_list()
{
return detail_token;
return detail_token_list;
}
};

View File

@ -4,8 +4,8 @@
class nasal_parse
{
private:
std::stack<token> parse;
std::stack<token> checked;
std::stack<token> parse_token_stream;
std::stack<token> checked_tokens;
token this_token;
int error;
int warning;
@ -28,7 +28,7 @@ class nasal_parse
void nasal_parse::print_detail_token()
{
std::stack<token> tmp=parse;
std::stack<token> tmp=parse_token_stream;
std::string space="";
int line=1;
std::cout<<line<<"\t";
@ -58,31 +58,31 @@ void nasal_parse::print_detail_token()
return;
}
void nasal_parse::get_token_list(std::list<token>& detail_token)
void nasal_parse::get_token_list(std::list<token>& detail_token_stream)
{
while(!parse.empty())
parse.pop();
while(!checked.empty())
checked.pop();
while(!parse_token_stream.empty())
parse_token_stream.pop();
while(!checked_tokens.empty())
checked_tokens.pop();
// clear stack
std::stack<token> tmp;
for(std::list<token>::iterator i=detail_token.begin();i!=detail_token.end();++i)
tmp.push(*i);
while(!tmp.empty())
std::stack<token> backward_tmp;
for(std::list<token>::iterator i=detail_token_stream.begin();i!=detail_token_stream.end();++i)
backward_tmp.push(*i);
while(!backward_tmp.empty())
{
parse.push(tmp.top());
tmp.pop();
parse_token_stream.push(backward_tmp.top());
backward_tmp.pop();
}
return;
}
void nasal_parse::get_token()
{
if(!parse.empty())
if(!parse_token_stream.empty())
{
this_token=parse.top();
parse.pop();
checked.push(this_token);
this_token=parse_token_stream.top();
parse_token_stream.pop();
checked_tokens.push(this_token);
}
else
{
@ -95,10 +95,10 @@ void nasal_parse::get_token()
void nasal_parse::push_token()
{
if(!checked.empty())
if(!checked_tokens.empty())
{
parse.push(checked.top());
checked.pop();
parse_token_stream.push(checked_tokens.top());
checked_tokens.pop();
}
else
std::cout<<">>[Parse-error] empty checked token stack."<<std::endl;
@ -123,7 +123,7 @@ void nasal_parse::main_generate()
root.set_line(1);
root.set_type(__root);
while(!parse.empty())
while(!parse_token_stream.empty())
{
get_token();
switch(this_token.type)