This commit is contained in:
Valk Richard Li 2019-09-02 09:38:01 -05:00 committed by GitHub
parent 5c2ab6e91c
commit 8be4436f74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 117 additions and 5 deletions

View File

@ -16,6 +16,8 @@
#define CALL_FUNC 8 // id( #define CALL_FUNC 8 // id(
#define FUNC_HEAD 9 // func( #define FUNC_HEAD 9 // func(
#define DYNAMIC_ID 10 // id... #define DYNAMIC_ID 10 // id...
#define IF_HEAD 11 // if (
#define ELSIF_HEAD 12 // elsif (
#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
@ -188,10 +190,15 @@ class nasal_lexer
} }
++ptr; ++ptr;
} }
else if((syn==RESERVEWORD) && (__token=="func") && (source[ptr]=='(')) else if((syn==RESERVEWORD) && ((__token=="func") || (__token=="if") || (__token=="elsif")) && (source[ptr]=='('))
{ {
if(__token=="func")
syn=FUNC_HEAD;
else if(__token=="if")
syn=IF_HEAD;
else if(__token=="elsif")
syn=ELSIF_HEAD;
__token+=source[ptr]; __token+=source[ptr];
syn=FUNC_HEAD;
++ptr; ++ptr;
} }
} }
@ -396,6 +403,10 @@ class nasal_lexer
std::cout<<"( Func head | "; std::cout<<"( Func head | ";
else if(temp.type==DYNAMIC_ID) else if(temp.type==DYNAMIC_ID)
std::cout<<"( Identifier | "; std::cout<<"( Identifier | ";
else if(temp.type==IF_HEAD)
std::cout<<"( If head | ";
else if(temp.type==ELSIF_HEAD)
std::cout<<"( Elsif head | ";
std::cout<<temp.content<<" )"<<std::endl; std::cout<<temp.content<<" )"<<std::endl;
} }
return; return;

View File

@ -26,6 +26,7 @@ enum token_type
__id,__dynamic_id, __id,__dynamic_id,
__return, __return,
__if,__elsif,__else, __if,__elsif,__else,
__if_head,__elsif_head,
__continue,__break,__for,__forindex,__foreach,__while, __continue,__break,__for,__forindex,__foreach,__while,
__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
@ -35,7 +36,7 @@ enum token_type
__hash, __hash,
__hash_member, __hash_member,
__identifier, __identifier,
__statement, __statement,__statements,
__function, __function,
__call_function, __call_function,
__call_list, __call_list,
@ -44,7 +45,7 @@ enum token_type
__assignment, __assignment,
__calculation, __calculation,
__loop, __loop,
__choose, __choose,__if_choose,__elsif_choose,__else_choose,
__program __program
}; };
@ -58,6 +59,31 @@ struct cmp_seq
cmp_seq par[]= cmp_seq par[]=
{ {
{{__program,__statement}, __program}, {{__program,__statement}, __program},
{{__program,__statements}, __program},
{{__elsif_choose,__elsif_choose}, __elsif_choose},
{{__else_choose,__elsif_choose,__if_choose}, __choose},
{{__else_choose,__if_choose}, __choose},
{{__elsif_choose,__if_choose}, __choose},
{{__if_choose}, __choose},// ?
{{__statement,__right_curve,__calculation,__if_head}, __if_choose},
{{__right_curve,__statement,__left_curve,__right_curve,__calculation,__if_head}, __if_choose},
{{__right_curve,__statements,__left_curve,__right_curve,__calculation,__if_head}, __if_choose},
{{__right_curve,__left_curve,__right_curve,__calculation,__if_head}, __if_choose},
{{__statement,__right_curve,__calculation,__elsif_head}, __elsif_choose},
{{__right_curve,__statement,__left_curve,__right_curve,__calculation,__elsif_head}, __elsif_choose},
{{__right_curve,__statements,__left_curve,__right_curve,__calculation,__elsif_head}, __elsif_choose},
{{__right_curve,__left_curve,__right_curve,__calculation,__elsif_head}, __elsif_choose},
{{__statement,__right_curve,__calculation,__if_head,__else}, __elsif_choose},
{{__right_curve,__statement,__left_curve,__right_curve,__calculation,__if_head,__else}, __elsif_choose},
{{__right_curve,__statements,__left_curve,__right_curve,__calculation,__if_head,__else}, __elsif_choose},
{{__right_curve,__left_curve,__right_curve,__calculation,__if_head,__else}, __elsif_choose},
{{__statement,__else}, __else_choose},
{{__right_curve,__statement,__left_curve,__else}, __else_choose},
{{__right_curve,__statements,__left_curve,__else}, __else_choose},
{{__right_curve,__left_curve,__else}, __else_choose},
{{__semi,__semi}, __semi}, {{__semi,__semi}, __semi},
{{__id,__dot,__id}, __call_hash}, {{__id,__dot,__id}, __call_hash},
@ -80,6 +106,11 @@ cmp_seq par[]=
{{__right_brace,__statement,__left_brace,__right_curve,__dynamic_id,__func_head}, __function}, {{__right_brace,__statement,__left_brace,__right_curve,__dynamic_id,__func_head}, __function},
{{__right_brace,__statement,__left_brace,__right_curve,__func_head}, __function}, {{__right_brace,__statement,__left_brace,__right_curve,__func_head}, __function},
{{__right_brace,__statements,__left_brace,__right_curve,__data_list,__func_head}, __function},
{{__right_brace,__statements,__left_brace,__right_curve,__id,__func_head}, __function},
{{__right_brace,__statements,__left_brace,__right_curve,__dynamic_id,__func_head}, __function},
{{__right_brace,__statements,__left_brace,__right_curve,__func_head}, __function},
{{__right_bracket,__number,__call_list_head}, __call_list}, {{__right_bracket,__number,__call_list_head}, __call_list},
{{__id,__comma,__id}, __data_list}, {{__id,__comma,__id}, __data_list},
@ -110,8 +141,49 @@ cmp_seq par[]=
{{__id,__link_operator,__calculation}, __calculation}, {{__id,__link_operator,__calculation}, __calculation},
{{__id,__link_operator,__id}, __calculation}, {{__id,__link_operator,__id}, __calculation},
{{__calculation,__cmp_equal,__calculation}, __calculation},
{{__calculation,__cmp_equal,__id}, __calculation},
{{__id,__cmp_equal,__calculation}, __calculation},
{{__id,__cmp_equal,__id}, __calculation},
{{__calculation,__cmp_not_equal,__calculation}, __calculation},
{{__calculation,__cmp_not_equal,__id}, __calculation},
{{__id,__cmp_not_equal,__calculation}, __calculation},
{{__id,__cmp_not_equal,__id}, __calculation},
{{__calculation,__cmp_less,__calculation}, __calculation},
{{__calculation,__cmp_less,__id}, __calculation},
{{__id,__cmp_less,__calculation}, __calculation},
{{__id,__cmp_less,__id}, __calculation},
{{__calculation,__cmp_less_or_equal,__calculation}, __calculation},
{{__calculation,__cmp_less_or_equal,__id}, __calculation},
{{__id,__cmp_less_or_equal,__calculation}, __calculation},
{{__id,__cmp_less_or_equal,__id}, __calculation},
{{__calculation,__cmp_more,__calculation}, __calculation},
{{__calculation,__cmp_more,__id}, __calculation},
{{__id,__cmp_more,__calculation}, __calculation},
{{__id,__cmp_more,__id}, __calculation},
{{__calculation,__cmp_more_or_equal,__calculation}, __calculation},
{{__calculation,__cmp_more_or_equal,__id}, __calculation},
{{__id,__cmp_more_or_equal,__calculation}, __calculation},
{{__id,__cmp_more_or_equal,__id}, __calculation},
{{__calculation,__and_operator,__calculation}, __calculation},
{{__calculation,__and_operator,__id}, __calculation},
{{__id,__and_operator,__calculation}, __calculation},
{{__id,__and_operator,__id}, __calculation},
{{__calculation,__or_operator,__calculation}, __calculation},
{{__calculation,__or_operator,__id}, __calculation},
{{__id,__or_operator,__calculation}, __calculation},
{{__id,__or_operator,__id}, __calculation},
{{__right_curve,__id,__left_curve}, __calculation}, {{__right_curve,__id,__left_curve}, __calculation},
{{__right_curve,__calculation,__left_curve}, __calculation}, {{__right_curve,__calculation,__left_curve}, __calculation},
{{__id,__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},
@ -173,7 +245,10 @@ cmp_seq par[]=
{{__definition}, __statement}, {{__definition}, __statement},
{{__assignment}, __statement}, {{__assignment}, __statement},
{{__statement,__statement}, __statement} {{__choose}, __statement},
{{__loop}, __statement},
{{__statement,__statement}, __statements},
{{__statements,__statement}, __statements}
}; };
int num_of_par=sizeof(par)/sizeof(cmp_seq); int num_of_par=sizeof(par)/sizeof(cmp_seq);
@ -323,6 +398,12 @@ void print_token(int type)
case __else: case __else:
context="else"; context="else";
break; break;
case __if_head:
context="if (";
break;
case __elsif_head:
context="elsif (";
break;
case __return: case __return:
context="return"; context="return";
break; break;
@ -353,6 +434,9 @@ void print_token(int type)
case __statement: case __statement:
context="statement"; context="statement";
break; break;
case __statements:
context="statements";
break;
case __function: case __function:
context="function"; context="function";
break; break;
@ -380,6 +464,15 @@ void print_token(int type)
case __choose: case __choose:
context="choose"; context="choose";
break; break;
case __if_choose:
context="if_choose";
break;
case __elsif_choose:
context="else_if_choose";
break;
case __else_choose:
context="else_choose";
break;
case __program: case __program:
context="program"; context="program";
break; break;
@ -587,6 +680,14 @@ class nasal_parser
{ {
temp_parse.type=__dynamic_id; temp_parse.type=__dynamic_id;
} }
else if((*i).type==IF_HEAD)
{
temp_parse.type=__if_head;
}
else if((*i).type==ELSIF_HEAD)
{
temp_parse.type=__elsif_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")