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;
}
}
while((a>1) and (a<100))
{
a-=1;
}

View File

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

View File

@ -28,6 +28,7 @@ enum token_type
__if,__elsif,__else,
__if_head,__elsif_head,
__continue,__break,__for,__forindex,__foreach,__while,
__while_head,
__call_list_head,__call_func_head,__func_head,
//end of operators & reserve words
__scalar,__data_list,__scalar_list,
@ -67,11 +68,15 @@ cmp_seq par[]=
{{__elsif_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,__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,__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},
{{__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,__number,__equal,__id,__var}, __definition},
{{__semi,__string,__equal,__id,__var}, __definition},
@ -235,6 +321,21 @@ cmp_seq par[]=
{{__semi,__list,__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,__number,__add_equal,__id}, __assignment},
{{__semi,__string,__add_equal,__id}, __assignment},
@ -431,6 +532,9 @@ void print_token(int type)
case __while:
context="while";
break;
case __while_head:
context="while (";
break;
case __if:
context="if";
break;
@ -645,6 +749,11 @@ class PDA
{
comp_stack.push(main_stack.top());
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)
print_main_and_comp();
while(1)
@ -736,6 +845,10 @@ class nasal_parser
{
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"))
{
if((*i).content=="for")