This commit is contained in:
Valk Richard Li 2019-09-02 23:56:50 -05:00 committed by GitHub
parent d5f9ce27c4
commit 2c578aa7df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 125 additions and 4 deletions

View File

@ -44,7 +44,10 @@ forindex(e;m)
var e=2; var e=2;
} }
} }
while((a>1) and (a<100))
{
a-=1;
}

View File

@ -18,6 +18,7 @@
#define DYNAMIC_ID 10 // id... #define DYNAMIC_ID 10 // id...
#define IF_HEAD 11 // if ( #define IF_HEAD 11 // if (
#define ELSIF_HEAD 12 // elsif ( #define ELSIF_HEAD 12 // elsif (
#define WHILE_HEAD 13 // while (
#define FAIL -1 //fail #define FAIL -1 //fail
#define SCANEND -2 //complete scanning #define SCANEND -2 //complete scanning
#define ERRORFOUND -3 //error occurred #define ERRORFOUND -3 //error occurred
@ -190,7 +191,7 @@ class nasal_lexer
} }
++ptr; ++ptr;
} }
else if((syn==RESERVEWORD) && ((__token=="func") || (__token=="if") || (__token=="elsif")) && (source[ptr]=='(')) else if((syn==RESERVEWORD) && ((__token=="func") || (__token=="if") || (__token=="elsif") || (__token=="while")) && (source[ptr]=='('))
{ {
if(__token=="func") if(__token=="func")
syn=FUNC_HEAD; syn=FUNC_HEAD;
@ -198,6 +199,8 @@ class nasal_lexer
syn=IF_HEAD; syn=IF_HEAD;
else if(__token=="elsif") else if(__token=="elsif")
syn=ELSIF_HEAD; syn=ELSIF_HEAD;
else if(__token=="while")
syn=WHILE_HEAD;
__token+=source[ptr]; __token+=source[ptr];
++ptr; ++ptr;
} }
@ -407,6 +410,8 @@ class nasal_lexer
std::cout<<"( If head | "; std::cout<<"( If head | ";
else if(temp.type==ELSIF_HEAD) else if(temp.type==ELSIF_HEAD)
std::cout<<"( Elsif head | "; std::cout<<"( Elsif head | ";
else if(temp.type==WHILE_HEAD)
std::cout<<"( While head | ";
std::cout<<temp.content<<" )"<<std::endl; std::cout<<temp.content<<" )"<<std::endl;
} }
return; return;

View File

@ -28,6 +28,7 @@ enum token_type
__if,__elsif,__else, __if,__elsif,__else,
__if_head,__elsif_head, __if_head,__elsif_head,
__continue,__break,__for,__forindex,__foreach,__while, __continue,__break,__for,__forindex,__foreach,__while,
__while_head,
__call_list_head,__call_func_head,__func_head, __call_list_head,__call_func_head,__func_head,
//end of operators & reserve words //end of operators & reserve words
__scalar,__data_list,__scalar_list, __scalar,__data_list,__scalar_list,
@ -67,11 +68,15 @@ cmp_seq par[]=
{{__elsif_choose,__if_choose}, __choose}, {{__elsif_choose,__if_choose}, __choose},
{{__if_choose}, __choose},// ? {{__if_choose}, __choose},// ?
{{__statement,__right_curve,__id,__semi,__id,__left_curve,__forindex}, __loop}, //{{__statement,__right_curve,__calculation,__while_head}, __loop},
{{__right_brace,__statement,__left_brace,__right_curve,__calculation,__while_head}, __loop},
{{__right_brace,__statements,__left_brace,__right_curve,__calculation,__while_head}, __loop},
//{{__statement,__right_curve,__id,__semi,__id,__left_curve,__forindex}, __loop},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__forindex}, __loop}, {{__right_brace,__statement,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__forindex}, __loop},
{{__right_brace,__statements,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__forindex},__loop}, {{__right_brace,__statements,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__forindex},__loop},
{{__statement,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop}, //{{__statement,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop}, {{__right_brace,__statement,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop},
{{__right_brace,__statements,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop}, {{__right_brace,__statements,__left_brace,__right_curve,__id,__semi,__id,__left_curve,__foreach}, __loop},
@ -220,6 +225,87 @@ cmp_seq par[]=
{{__right_curve,__calculation,__left_curve}, __calculation}, {{__right_curve,__calculation,__left_curve}, __calculation},
{{__id,__nor_operator}, __calculation}, {{__id,__nor_operator}, __calculation},
{{__calculation,__add_operator,__number}, __calculation},
{{__number,__add_operator,__calculation}, __calculation},
{{__number,__add_operator,__number}, __calculation},
{{__number,__add_operator,__id}, __calculation},
{{__id,__add_operator,__number}, __calculation},
{{__calculation,__sub_operator,__number}, __calculation},
{{__number,__sub_operator,__calculation}, __calculation},
{{__number,__sub_operator,__number}, __calculation},
{{__number,__sub_operator,__id}, __calculation},
{{__id,__sub_operator,__number}, __calculation},
{{__calculation,__mul_operator,__number}, __calculation},
{{__number,__mul_operator,__calculation}, __calculation},
{{__number,__mul_operator,__number}, __calculation},
{{__number,__mul_operator,__id}, __calculation},
{{__id,__mul_operator,__number}, __calculation},
{{__calculation,__div_operator,__number}, __calculation},
{{__number,__div_operator,__calculation}, __calculation},
{{__number,__div_operator,__number}, __calculation},
{{__number,__div_operator,__id}, __calculation},
{{__id,__div_operator,__number}, __calculation},
{{__calculation,__link_operator,__number}, __calculation},
{{__number,__link_operator,__calculation}, __calculation},
{{__number,__link_operator,__number}, __calculation},
{{__number,__link_operator,__id}, __calculation},
{{__id,__link_operator,__number}, __calculation},
{{__calculation,__cmp_equal,__number}, __calculation},
{{__number,__cmp_equal,__calculation}, __calculation},
{{__number,__cmp_equal,__number}, __calculation},
{{__number,__cmp_equal,__id}, __calculation},
{{__id,__cmp_equal,__number}, __calculation},
{{__calculation,__cmp_not_equal,__number}, __calculation},
{{__number,__cmp_not_equal,__calculation}, __calculation},
{{__number,__cmp_not_equal,__number}, __calculation},
{{__number,__cmp_not_equal,__id}, __calculation},
{{__id,__cmp_not_equal,__number}, __calculation},
{{__calculation,__cmp_less,__number}, __calculation},
{{__number,__cmp_less,__calculation}, __calculation},
{{__number,__cmp_less,__number}, __calculation},
{{__number,__cmp_less,__id}, __calculation},
{{__id,__cmp_less,__number}, __calculation},
{{__calculation,__cmp_less_or_equal,__number}, __calculation},
{{__number,__cmp_less_or_equal,__calculation}, __calculation},
{{__number,__cmp_less_or_equal,__number}, __calculation},
{{__number,__cmp_less_or_equal,__id}, __calculation},
{{__id,__cmp_less_or_equal,__number}, __calculation},
{{__calculation,__cmp_more,__number}, __calculation},
{{__number,__cmp_more,__calculation}, __calculation},
{{__number,__cmp_more,__number}, __calculation},
{{__number,__cmp_more,__id}, __calculation},
{{__id,__cmp_more,__number}, __calculation},
{{__calculation,__cmp_more_or_equal,__number}, __calculation},
{{__number,__cmp_more_or_equal,__calculation}, __calculation},
{{__number,__cmp_more_or_equal,__number}, __calculation},
{{__number,__cmp_more_or_equal,__id}, __calculation},
{{__id,__cmp_more_or_equal,__number}, __calculation},
{{__calculation,__and_operator,__number}, __calculation},
{{__number,__and_operator,__calculation}, __calculation},
{{__number,__and_operator,__number}, __calculation},
{{__number,__and_operator,__id}, __calculation},
{{__id,__and_operator,__number}, __calculation},
{{__calculation,__or_operator,__number}, __calculation},
{{__number,__or_operator,__calculation}, __calculation},
{{__number,__or_operator,__number}, __calculation},
{{__number,__or_operator,__id}, __calculation},
{{__id,__or_operator,__number}, __calculation},
{{__right_curve,__number,__left_curve}, __calculation},
{{__number,__nor_operator}, __calculation},
{{__semi,__calculation,__equal,__id,__var}, __definition}, {{__semi,__calculation,__equal,__id,__var}, __definition},
{{__semi,__number,__equal,__id,__var}, __definition}, {{__semi,__number,__equal,__id,__var}, __definition},
{{__semi,__string,__equal,__id,__var}, __definition}, {{__semi,__string,__equal,__id,__var}, __definition},
@ -235,6 +321,21 @@ cmp_seq par[]=
{{__semi,__list,__equal,__id,__var}, __definition}, {{__semi,__list,__equal,__id,__var}, __definition},
{{__semi,__hash,__equal,__id,__var}, __definition}, {{__semi,__hash,__equal,__id,__var}, __definition},
{{__semi,__calculation,__equal,__id}, __assignment},
{{__semi,__number,__equal,__id}, __assignment},
{{__semi,__string,__equal,__id}, __assignment},
{{__semi,__id,__equal,__id}, __assignment},
{{__semi,__char,__equal,__id}, __assignment},
{{__semi,__right_brace,__left_brace,__equal,__id}, __assignment},
{{__semi,__right_bracket,__left_bracket,__equal,__id}, __assignment},
{{__semi,__call_function,__equal,__id}, __assignment},
{{__semi,__call_list,__equal,__id}, __assignment},
{{__function,__equal,__id}, __assignment},
{{__semi,__function,__equal,__id}, __assignment},
{{__semi,__call_hash,__equal,__id}, __assignment},
{{__semi,__list,__equal,__id}, __assignment},
{{__semi,__hash,__equal,__id}, __assignment},
{{__semi,__calculation,__add_equal,__id}, __assignment}, {{__semi,__calculation,__add_equal,__id}, __assignment},
{{__semi,__number,__add_equal,__id}, __assignment}, {{__semi,__number,__add_equal,__id}, __assignment},
{{__semi,__string,__add_equal,__id}, __assignment}, {{__semi,__string,__add_equal,__id}, __assignment},
@ -431,6 +532,9 @@ void print_token(int type)
case __while: case __while:
context="while"; context="while";
break; break;
case __while_head:
context="while (";
break;
case __if: case __if:
context="if"; context="if";
break; break;
@ -645,6 +749,11 @@ class PDA
{ {
comp_stack.push(main_stack.top()); comp_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
if((comp_stack.top()==__id) && (!main_stack.empty()) && (main_stack.top()==__var)) // special LR(1)
{
comp_stack.push(main_stack.top());
main_stack.pop();
}
if(show) if(show)
print_main_and_comp(); print_main_and_comp();
while(1) while(1)
@ -736,6 +845,10 @@ class nasal_parser
{ {
temp_parse.type=__elsif_head; temp_parse.type=__elsif_head;
} }
else if((*i).type==WHILE_HEAD)
{
temp_parse.type=__while_head;
}
else if(((*i).content=="for") || ((*i).content=="foreach") || ((*i).content=="while") || ((*i).content=="forindex")) else if(((*i).content=="for") || ((*i).content=="foreach") || ((*i).content=="while") || ((*i).content=="forindex"))
{ {
if((*i).content=="for") if((*i).content=="for")