This commit is contained in:
Valk Richard Li 2019-09-05 17:05:25 +08:00 committed by GitHub
parent f78a28546b
commit 225b079fc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 348 additions and 41 deletions

View File

@ -95,8 +95,10 @@ call_list
call_hash
:id.id
|id.call
|id.scalar
|call.id
|call.call
|call.scalar
;
call_function
:id()
@ -107,30 +109,142 @@ call_function
|id(hash)
|id(function)
|id(datas)
calculation
:id operator id
|id operator scalar
|id operator call
|scalar operator id
|scalar operator scalar
|scalar operator call
|call operator id
|call operator scalar
|call operator call
:id two_operator id
|id two_operator scalar
|id two_operator call
|scalar two_operator id
|scalar two_operator scalar
|scalar two_operator call
|call two_operator id
|call two_operator scalar
|call two_operator call
|(id)
|(scalar)
|(call)
|! id
|! scalar
|! call
|+-id
|+-scalar
|+-call
|__add0 -id
|__add0 -scalar
|__add0 -call
|__add0 +id
|__add0 +scalar
|__add0 +call
;
two_operator
:+
|-
|*
|/
|~
|==
|>
|>=
|<
|<=
|!=
|and
|or
;
assignment_operator
:+=
|-=
|*=
|/=
|~=
;
function
:func{}
|func{statement}
|func{statements}
|func(){}
|func(){statement}
|func(){statements}
|func(id){}
|func(id){statement}
|func(id){statements}
|func(scalar){}
|func(scalar){statement}
|func(scalar){statements}
|func(call){}
|func(call){statement}
|func(call){statements}
|func(list){}
|func(list){statement}
|func(list){statements}
|func(hash){}
|func(hash){statement}
|func(hash){statements}
|func(function){}
|func(function){statement}
|func(function){statements}
|func(dynamic_id){}
|func(dynamic_id){statement}
|func(dynamic_id){statements}
|func(datas){}
|func(datas){statement}
|func(datas){statements}
choose
:if(id){}
|if(scalar){}
|if(call){statement}
|if(id){statement}
|if(scalar){statement}
|if(call){statement}
|if(id){statements}
|if(scalar){statements}
|if(call){statements}
|else if(id){}
|else if(scalar){}
|else if(call){statement}
|else if(id){statement}
|else if(scalar){statement}
|else if(call){statement}
|else if(id){statements}
|else if(scalar){statements}
|else if(call){statements}
|elsif(id){}
|elsif(scalar){}
|elsif(call){statement}
|elsif(id){statement}
|elsif(scalar){statement}
|elsif(call){statement}
|elsif(id){statements}
|elsif(scalar){statements}
|elsif(call){statements}
|else{}
|else{statement}
|else{statements}
loop
:while(id){}
|while(scalar){}
|while(call){}
|while(id){statement}
|while(scalar){statement}
|while(call){statement}
|while(id){statements}
|while(scalar){statements}
|while(call){statements}
|forindex|foreach(statement id){}
|forindex|foreach(statement scalar){}
|forindex|foreach(statement call){}
|forindex|foreach(statement list){}
|forindex|foreach(statement id){statement}
|forindex|foreach(statement scalar){statement}
|forindex|foreach(statement call){statement}
|forindex|foreach(statement list){statement}
|forindex|foreach(statement id){statements}
|forindex|foreach(statement scalar){statements}
|forindex|foreach(statement call){statements}
|forindex|foreach(statement list){statements}
|for(statement pre_assignment){}
|for(statement pre_assignment){statement}
|for(statement pre_assignment){statements}
definition
:var id = id;
@ -138,31 +252,44 @@ definition
|var id = call;
|var id = list;
|var id = hash;
|var id = function
|var id = function;
|var id;
assignment
:id = id;
|id = scalar;
|id = call;
pre_assignment
:id = id
|id = scalar
|id = call
|id = function
|id = list;
|id = hash;
|call = id;
|call = scalar;
|call = call;
|id = list
|id = hash
|call = id
|call = scalar
|call = call
|call = function
|call = list;
|call = hash;
|call = list
|call = hash
|id assignment_operator id
|id assignment_operator scalar
|id assignment_operator call
|call assignment_operator id
|call assignment_operator scalar
|call assignment_operator call
;
statement
:return id;
assignment
:pre_assignment ;
;
return_scalar
:return id;
|return scalar;
|return call;
|return function;
|return list;
|return hash;
|continue;
|return;
;
statement
:continue;
|break;
|return_scalar
|definition
|assignment
|loop

View File

@ -42,8 +42,8 @@ enum token_type
__call_list,
__call_hash,
__call,
__definition,
__assignment,__pre_assignment,
__definition,__return_scalar,
__assignment,__pre_assignment,__assignment_operator,
__calculation,
__loop,
__choose,__if_choose,__elsif_choose,__else_choose,
@ -60,6 +60,24 @@ struct cmp_seq
cmp_seq par[]=
{
{{__program,__statement}, __program},
{{__add_operator},__two_operator},
{{__sub_operator},__two_operator},
{{__mul_operator},__two_operator},
{{__div_operator},__two_operator},
{{__link_operator},__two_operator},
{{__and_operator},__two_operator},
{{__or_operator},__two_operator},
{{__cmp_equal},__two_operator},
{{__cmp_not_equal},__two_operator},
{{__cmp_less},__two_operator},
{{__cmp_less_or_equal},__two_operator},
{{__cmp_more},__two_operator},
{{__cmp_more_or_equal},__two_operator},
{{__add_equal},__assignment_operator},
{{__sub_equal},__assignment_operator},
{{__mul_equal},__assignment_operator},
{{__div_equal},__assignment_operator},
{{__link_equal},__assignment_operator},
{{__number},__scalar},
{{__string},__scalar},
@ -121,14 +139,12 @@ cmp_seq par[]=
{{__hash_member,__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,__scalar,__left_bracket},__list},
{{__right_bracket,__call,__left_bracket},__list},
{{__right_bracket,__function,__left_bracket},__list},
{{__right_bracket,__data_list,__left_bracket},__list},
{{__right_brace,__left_brace},__hash},
{{__right_brace,__hash_member,__left_brace},__hash},
{{__right_brace,__hash_member_list,__left_brace},__hash},
@ -145,6 +161,8 @@ cmp_seq par[]=
{{__id,__dot,__id},__call_hash},
{{__id,__dot,__call},__call_hash},
{{__scalar,__dot,__id},__call_hash},
{{__scalar,__dot,__call},__call_hash},
{{__call,__dot,__id},__call_hash},
{{__call,__dot,__call},__call_hash},
@ -156,6 +174,155 @@ cmp_seq par[]=
{{__right_curve,__hash,__left_curve,__id},__call_function},
{{__right_curve,__function,__left_curve,__id},__call_function},
{{__right_curve,__data_list,__left_curve,__id},__call_function},
{{__id,__two_operator,__id},__calculation},
{{__id,__two_operator,__scalar},__calculation},
{{__id,__two_operator,__call},__calculation},
{{__scalar,__two_operator,__id},__calculation},
{{__scalar,__two_operator,__scalar},__calculation},
{{__scalar,__two_operator,__call},__calculation},
{{__call,__two_operator,__id},__calculation},
{{__call,__two_operator,__scalar},__calculation},
{{__call,__two_operator,__call},__calculation},
{{__id,__nor_operator},__calculation},
{{__scalar,__nor_operator},__calculation},
{{__call,__nor_operator},__calculation},
{{__right_curve,__id,__left_curve},__calculation},
{{__right_curve,__scalar,__left_curve},__calculation},
{{__right_curve,__call,__left_curve},__calculation},
{{__semi,__id,__return},__return_scalar},
{{__semi,__scalar,__return},__return_scalar},
{{__semi,__call,__return},__return_scalar},
{{__semi,__function,__return},__return_scalar},
{{__semi,__list,__return},__return_scalar},
{{__semi,__hash,__return},__return_scalar},
{{__semi,__return},__return_scalar},
{{__right_brace,__left_brace,__func},__function},
{{__right_brace,__statement,__left_brace,__func},__function},
{{__right_brace,__left_brace,__right_curve,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__id,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__call,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__list,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__list,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__hash,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__hash,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__function,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__function,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__dynamic_id,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__dynamic_id,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__data_list,__left_curve,__func},__function},
{{__right_brace,__statement,__left_brace,__right_curve,__data_list,__left_curve,__func},__function},
{{__right_brace,__left_brace,__right_curve,__id,__left_curve,__if},__choose},
{{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__if},__choose},
{{__right_brace,__left_brace,__right_curve,__call,__left_curve,__if},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__if},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__if},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__if},__choose},
{{__right_brace,__left_brace,__right_curve,__id,__left_curve,__if,__else},__choose},
{{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__if,__else},__choose},
{{__right_brace,__left_brace,__right_curve,__call,__left_curve,__if,__else},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__if,__else},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__if,__else},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__if,__else},__choose},
{{__right_brace,__left_brace,__right_curve,__id,__left_curve,__elsif},__choose},
{{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__elsif},__choose},
{{__right_brace,__left_brace,__right_curve,__call,__left_curve,__elsif},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__elsif},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__elsif},__choose},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__elsif},__choose},
{{__right_brace,__left_brace,__else},__choose},
{{__right_brace,__statement,__left_brace,__else},__choose},
{{__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,__scalar,__equal,__id,__var},__definition},
{{__semi,__call,__equal,__id,__var},__definition},
{{__semi,__function,__equal,__id,__var},__definition},
{{__semi,__list,__equal,__id,__var},__definition},
{{__semi,__hash,__equal,__id,__var},__definition},
{{__semi,__id,__var},__definition},
{{__id,__equal,__id},__pre_assignment},
{{__scalar,__equal,__id},__pre_assignment},
{{__call,__equal,__id},__pre_assignment},
{{__function,__equal,__id},__pre_assignment},
{{__list,__equal,__id},__pre_assignment},
{{__hash,__equal,__id},__pre_assignment},
{{__id,__equal,__call},__pre_assignment},
{{__scalar,__equal,__call},__pre_assignment},
{{__call,__equal,__call},__pre_assignment},
{{__function,__equal,__call},__pre_assignment},
{{__list,__equal,__call},__pre_assignment},
{{__hash,__equal,__call},__pre_assignment},
{{__id,__assignment_operator,__id},__pre_assignment},
{{__scalar,__assignment_operator,__id},__pre_assignment},
{{__call,__assignment_operator,__id},__pre_assignment},
{{__id,__assignment_operator,__call},__pre_assignment},
{{__scalar,__assignment_operator,__call},__pre_assignment},
{{__call,__assignment_operator,__call},__pre_assignment},
{{__semi,__pre_assignment},__assignment},
{{__right_brace,__left_brace,__right_curve,__id,__left_curve,__while},__loop},
{{__right_brace,__left_brace,__right_curve,__scalar,__left_curve,__while},__loop},
{{__right_brace,__left_brace,__right_curve,__call,__left_curve,__while},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__left_curve,__while},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__scalar,__left_curve,__while},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__left_curve,__while},__loop},
{{__right_brace,__left_brace,__right_curve,__id,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__left_brace,__right_curve,__call,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__left_brace,__right_curve,__list,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__list,__statement,__left_curve,__forindex},__loop},
{{__right_brace,__left_brace,__right_curve,__id,__statement,__left_curve,__foreach},__loop},
{{__right_brace,__left_brace,__right_curve,__call,__statement,__left_curve,__foreach},__loop},
{{__right_brace,__left_brace,__right_curve,__list,__statement,__left_curve,__foreach},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__id,__statement,__left_curve,__foreach},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__call,__statement,__left_curve,__foreach},__loop},
{{__right_brace,__statement,__left_brace,__right_curve,__list,__statement,__left_curve,__foreach},__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},
{{__return_scalar},__statement},
{{__semi,__continue},__statement},
{{__semi,__break},__statement},
{{__semi,__id,__semi},__semi},
{{__semi,__call,__semi},__semi},
{{__semi,__scalar,__semi},__semi},
{{__semi,__list,__semi},__semi},
{{__semi,__hash,__semi},__semi},
{{__semi,__id,__right_brace},__right_brace},
{{__semi,__call,__right_brace},__right_brace},
{{__semi,__scalar,__right_brace},__right_brace},
{{__semi,__list,__right_brace},__right_brace},
{{__semi,__hash,__right_brace},__right_brace},
{{__semi,__id,__left_brace},__left_brace},
{{__semi,__call,__left_brace},__left_brace},
{{__semi,__scalar,__left_brace},__left_brace},
{{__semi,__list,__left_brace},__left_brace},
{{__semi,__hash,__left_brace},__left_brace},
{{__semi,__id,__left_curve},__left_curve},
{{__semi,__call,__left_curve},__left_curve},
{{__semi,__scalar,__left_curve},__left_curve},
{{__semi,__list,__left_curve},__left_curve},
{{__semi,__hash,__left_curve},__left_curve},
{{__loop},__statement},
{{__choose},__statement},
{{__definition},__statement},
{{__assignment},__statement},
};
int num_of_par=sizeof(par)/sizeof(cmp_seq);
@ -342,10 +509,10 @@ void print_token(int type)
context="call_hash";
break;
case __definition:
context="definition";
context="definition;";
break;
case __assignment:
context="assignment";
context="assignment;";
break;
case __calculation:
context="calc";
@ -384,6 +551,12 @@ void print_token(int type)
case __two_operator:
context="operator";
break;
case __assignment_operator:
context="operator";
break;
case __return_scalar:
context="return_scl;";
break;
default:
context="unknown_type";
break;
@ -410,6 +583,9 @@ class PDA
while(!comp_stack.empty())
comp_stack.pop();
main_stack.push(__stack_end);
main_stack.push(__var);
main_stack.push(__id);
main_stack.push(__semi);
comp_stack.push(__stack_end);
comp_stack.push(__program);
}
@ -504,17 +680,21 @@ class PDA
{
comp_stack.push(main_stack.top());
main_stack.pop();
// if((comp_stack.top()==__left_bracket) && (!main_stack.empty()) && (main_stack.top()==__id))
// {
// comp_stack.push(main_stack.top());
// main_stack.pop();
// }
if((comp_stack.top()==__left_curve) && (!main_stack.empty()) && ((main_stack.top()==__id) || (main_stack.top()==__if) || (main_stack.top()==__elsif) || (main_stack.top()==__while) || (main_stack.top()==__func)))
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)))
{
comp_stack.push(main_stack.top());
main_stack.pop();
}
else if((comp_stack.top()==__id) && (!main_stack.top()) && (main_stack.top()==__var))
else if((comp_stack.top()==__id) && (main_stack.top()==__var))
{
comp_stack.push(main_stack.top());
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))
{
main_stack.push(__number);
}
if((comp_stack.top()==__if) && (main_stack.top()==__else))
{
comp_stack.push(main_stack.top());
main_stack.pop();