This commit is contained in:
Valk Richard Li 2019-09-06 00:00:17 +08:00 committed by GitHub
parent 493b09acfe
commit caf9d35a82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 48 deletions

View File

@ -10,24 +10,22 @@ int main()
nasal_parser pas; nasal_parser pas;
std::string command; std::string command;
std::cout<<">> Nasal interpreter by ValKmjolnir"<<std::endl; std::cout<<">> Nasal interpreter by ValKmjolnir"<<std::endl;
std::cout<<">> input \"help\" to find help."<<std::endl; std::cout<<">> input [help] to find help."<<std::endl;
std::cout<<">> Be careful: this interpreter uses strict methods to check if there's an error."<<std::endl;
std::cout<<" Always add \";\" after each statement (except loop and if-else)."<<std::endl;
while(1) while(1)
{ {
std::cout<<">> "; std::cout<<">> ";
std::getline(std::cin,command); std::getline(std::cin,command);
if(command=="help") if(command=="help")
{ {
std::cout<<">> nasal script interpreter by ValKmjolnir"<<std::endl; std::cout<<">> Nasal interpreter by ValKmjolnir"<<std::endl;
std::cout<<">> 1. |input file name to load the file."<<std::endl; std::cout<<">> 1. [ ] |input file name to load the file."<<std::endl;
std::cout<<">> 2. \"cls\" |clear the screen."<<std::endl; std::cout<<">> 2. [cls ] |clear the screen."<<std::endl;
std::cout<<">> 3. \"exit\" |shut down the interpreter."<<std::endl; std::cout<<">> 3. [exit ] |shut down the interpreter."<<std::endl;
std::cout<<">> 4. \"lexer\" |run and show the lexer. (-lexer)"<<std::endl; std::cout<<">> 4. [lexer ] |run and show the lexer. (-lexer)"<<std::endl;
std::cout<<">> 5. \"parser\"|run parser. (-parser)"<<std::endl; std::cout<<">> 5. [parser] |run parser. (-parser)"<<std::endl;
std::cout<<">> 6. \"del\" |delete all elements in stack."<<std::endl; std::cout<<">> 6. [del ] |delete all elements in stack."<<std::endl;
std::cout<<">> 7. \"run\" |run the programme in stack. (-lexer -parser)"<<std::endl; std::cout<<">> 7. [run ] |run the programme in stack. (-lexer -parser)"<<std::endl;
std::cout<<">> 8. \"rs\" |check the source program."<<std::endl; std::cout<<">> 8. [rs ] |check the source program."<<std::endl;
} }
else if(command=="cls") else if(command=="cls")
{ {

View File

@ -131,11 +131,15 @@ cmp_seq par[]=
{{__id,__colon,__id},__hash_member}, {{__id,__colon,__id},__hash_member},
{{__scalar,__colon,__id},__hash_member}, {{__scalar,__colon,__id},__hash_member},
{{__call,__colon,__id},__hash_member}, {{__call,__colon,__id},__hash_member},
{{__list,__colon,__id},__hash_member},
{{__hash,__colon,__id},__hash_member},
{{__right_brace,__left_brace,__colon,__id},__hash_member},
{{__function,__colon,__id},__hash_member}, {{__function,__colon,__id},__hash_member},
{{__hash_member,__comma,__hash_member},__hash_member_list}, {{__hash_member,__comma,__hash_member},__hash_member_list},
{{__hash_member_list,__comma,__hash_member},__hash_member_list}, {{__hash_member_list,__comma,__hash_member},__hash_member_list},
{{__right_bracket,__left_bracket},__list},
{{__right_bracket,__id,__left_bracket},__list}, {{__right_bracket,__id,__left_bracket},__list},
{{__right_bracket,__scalar,__left_bracket},__list}, {{__right_bracket,__scalar,__left_bracket},__list},
{{__right_bracket,__call,__left_bracket},__list}, {{__right_bracket,__call,__left_bracket},__list},
@ -241,7 +245,6 @@ cmp_seq par[]=
{{__right_brace,__statement,__left_brace,__else},__choose}, {{__right_brace,__statement,__left_brace,__else},__choose},
{{__semi,__id,__equal,__id,__var},__definition}, {{__semi,__id,__equal,__id,__var},__definition},
{{__semi,__right_bracket,__left_bracket,__equal,__id,__var},__definition},
{{__semi,__right_brace,__left_brace,__equal,__id,__var},__definition}, {{__semi,__right_brace,__left_brace,__equal,__id,__var},__definition},
{{__semi,__scalar,__equal,__id,__var},__definition}, {{__semi,__scalar,__equal,__id,__var},__definition},
{{__semi,__call,__equal,__id,__var},__definition}, {{__semi,__call,__equal,__id,__var},__definition},
@ -291,15 +294,12 @@ cmp_seq par[]=
{{__right_brace,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop}, {{__right_brace,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop}, {{__right_brace,__statement,__left_brace,__right_curve,__pre_assignment,__statement,__left_curve,__for},__loop},
{{__return_scalar},__statement},
{{__semi,__continue},__statement},
{{__semi,__break},__statement},
{{__semi,__id,__semi},__semi}, {{__semi,__id,__semi},__semi},
{{__semi,__call,__semi},__semi}, {{__semi,__call,__semi},__semi},
{{__semi,__scalar,__semi},__semi}, {{__semi,__scalar,__semi},__semi},
{{__semi,__list,__semi},__semi}, {{__semi,__list,__semi},__semi},
{{__semi,__hash,__semi},__semi}, {{__semi,__hash,__semi},__semi},
{{__semi,__semi},__semi},
{{__semi,__id,__right_brace},__right_brace}, {{__semi,__id,__right_brace},__right_brace},
{{__semi,__call,__right_brace},__right_brace}, {{__semi,__call,__right_brace},__right_brace},
{{__semi,__scalar,__right_brace},__right_brace}, {{__semi,__scalar,__right_brace},__right_brace},
@ -316,6 +316,10 @@ cmp_seq par[]=
{{__semi,__list,__left_curve},__left_curve}, {{__semi,__list,__left_curve},__left_curve},
{{__semi,__hash,__left_curve},__left_curve}, {{__semi,__hash,__left_curve},__left_curve},
{{__return_scalar},__statement},
{{__semi,__continue},__statement},
{{__semi,__break},__statement},
{{__statement,__statement},__statement},
{{__loop},__statement}, {{__loop},__statement},
{{__choose},__statement}, {{__choose},__statement},
{{__definition},__statement}, {{__definition},__statement},
@ -567,8 +571,8 @@ struct parse_unit
class PDA class PDA
{ {
private: private:
std::stack<int> main_stack; std::stack<parse_unit> main_stack;
std::stack<int> comp_stack; std::stack<parse_unit> comp_stack;
public: public:
void set_stack_empty() void set_stack_empty()
{ {
@ -576,30 +580,39 @@ class PDA
main_stack.pop(); main_stack.pop();
while(!comp_stack.empty()) while(!comp_stack.empty())
comp_stack.pop(); comp_stack.pop();
main_stack.push(__stack_end); parse_unit temp;
main_stack.push(__var); temp.line=0;
main_stack.push(__id); temp.type=__stack_end;
main_stack.push(__semi); main_stack.push(temp);
comp_stack.push(__stack_end); temp.type=__var;
comp_stack.push(__program); main_stack.push(temp);
temp.type=__id;
main_stack.push(temp);
temp.type=__semi;
main_stack.push(temp);
temp.type=__stack_end;
comp_stack.push(temp);
temp.type=__program;
comp_stack.push(temp);
} }
void stack_input(std::stack<parse_unit>& temp) void stack_input(std::stack<parse_unit>& temp)
{ {
set_stack_empty(); set_stack_empty();
while(!temp.empty()) while(!temp.empty())
{ {
main_stack.push(temp.top().type); main_stack.push(temp.top());
temp.pop(); temp.pop();
} }
return; return;
} }
void print_stack(std::stack<int>& temp) void print_stack(std::stack<parse_unit>& temp)
{ {
std::stack<int> t; std::stack<parse_unit> t;
while(!temp.empty()) while(!temp.empty())
{ {
t.push(temp.top()); t.push(temp.top());
print_token(t.top()); print_token(t.top().type);
std::cout<<" "; std::cout<<" ";
temp.pop(); temp.pop();
} }
@ -621,7 +634,7 @@ class PDA
} }
bool reducable() bool reducable()
{ {
std::stack<int> temp; std::stack<parse_unit> temp;
for(int i=0;i<num_of_par;++i) for(int i=0;i<num_of_par;++i)
{ {
for(int j=max_len-1;j>=0;--j) for(int j=max_len-1;j>=0;--j)
@ -631,7 +644,7 @@ class PDA
// if par[i].tokens[j] is 0 then continue until the tokens[j] is not 0 // if par[i].tokens[j] is 0 then continue until the tokens[j] is not 0
temp.push(comp_stack.top()); temp.push(comp_stack.top());
comp_stack.pop(); comp_stack.pop();
if((par[i].tokens[j]!=temp.top()) || (comp_stack.empty() && par[i].tokens[j])) if((par[i].tokens[j]!=temp.top().type) || (comp_stack.empty() && par[i].tokens[j]))
{ {
while(!temp.empty()) while(!temp.empty())
{ {
@ -640,9 +653,12 @@ class PDA
} }
break; break;
} }
if((par[i].tokens[j]==temp.top()) && (j==0)) if((par[i].tokens[j]==temp.top().type) && (j==0))
{ {
comp_stack.push(par[i].res); parse_unit t;
t.line=temp.top().line;
t.type=par[i].res;
comp_stack.push(t);
return true; return true;
} }
} }
@ -651,15 +667,18 @@ class PDA
} }
void print_error() void print_error()
{ {
int cnt_line=0;
while(!comp_stack.empty()) while(!comp_stack.empty())
{ {
if((comp_stack.top()!=__statement) && (comp_stack.top()!=__program) && (comp_stack.top()!=__stack_end)) if((comp_stack.top().type!=__program) && (comp_stack.top().type!=__stack_end))
{ {
print_token(comp_stack.top()); if(cnt_line!=comp_stack.top().line)
{
cnt_line=comp_stack.top().line;
std::cout<<std::endl<<"line "<<cnt_line<<" ";
}
print_token(comp_stack.top().type);
std::cout<<" "; std::cout<<" ";
int t=comp_stack.top();
if((t==__right_brace) || (t==__semi))
std::cout<<std::endl;
} }
comp_stack.pop(); comp_stack.pop();
} }
@ -670,25 +689,28 @@ class PDA
{ {
if(show) if(show)
print_main_and_comp(); print_main_and_comp();
while(main_stack.top()!=__stack_end) while(main_stack.top().type!=__stack_end)
{ {
comp_stack.push(main_stack.top()); comp_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
if((comp_stack.top()==__left_curve) && ((main_stack.top()==__id) || (main_stack.top()==__if) || (main_stack.top()==__elsif) || (main_stack.top()==__while) || (main_stack.top()==__func))) if((comp_stack.top().type==__left_curve) && ((main_stack.top().type==__id) || (main_stack.top().type==__if) || (main_stack.top().type==__elsif) || (main_stack.top().type==__while) || (main_stack.top().type==__func)))
{ {
comp_stack.push(main_stack.top()); comp_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
} }
else if((comp_stack.top()==__id) && (main_stack.top()==__var)) else if((comp_stack.top().type==__id) && (main_stack.top().type==__var))
{ {
comp_stack.push(main_stack.top()); comp_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
} }
else if(((comp_stack.top()==__sub_operator) || (comp_stack.top()==__add_operator)) && (main_stack.top()!=__id) && (main_stack.top()!=__right_curve) && (main_stack.top()!=__right_bracket)) else if(((comp_stack.top().type==__sub_operator) || (comp_stack.top().type==__add_operator)) && (main_stack.top().type!=__id) && (main_stack.top().type!=__right_curve) && (main_stack.top().type!=__right_bracket))
{ {
main_stack.push(__number); parse_unit t;
t.line=comp_stack.top().line;
t.type=__number;
main_stack.push(t);
} }
if((comp_stack.top()==__if) && (main_stack.top()==__else)) if((comp_stack.top().type==__if) && (main_stack.top().type==__else))
{ {
comp_stack.push(main_stack.top()); comp_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
@ -703,20 +725,20 @@ class PDA
print_main_and_comp(); print_main_and_comp();
} }
} }
if(comp_stack.top()==__program) if(comp_stack.top().type==__program)
{ {
comp_stack.pop(); comp_stack.pop();
if(comp_stack.top()==__stack_end) if(comp_stack.top().type==__stack_end)
std::cout<<">>[Parse] 0 error(s)."<<std::endl; std::cout<<">>[Parse] 0 error(s)."<<std::endl;
else else
{ {
std::cout<<">>[Parse] Error:"<<std::endl; std::cout<<">>[Parse] Error:";
print_error(); print_error();
} }
} }
else else
{ {
std::cout<<">>[Parse] Error:"<<std::endl; std::cout<<">>[Parse] Error:";
print_error(); print_error();
} }
std::cout<<">>[Parse] Complete checking."<<std::endl; std::cout<<">>[Parse] Complete checking."<<std::endl;