Bug fixed

This commit is contained in:
Valk Richard Li 2019-08-27 12:28:16 -05:00 committed by GitHub
parent 7f10825884
commit 7eb4917bda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 101 additions and 15 deletions

View File

@ -24,14 +24,16 @@ enum token_type
__dot,// . __dot,// .
__var,// var reserve word __var,// var reserve word
__func,// func reserve word __func,// func reserve word
__id,__identifier,__identifiers,__identifier_end,__lacked_identifier, __id,
__identifier,__identifiers,__identifier_end,__lacked_identifier,
__parameter,__parameters,__parameter_end, __parameter,__parameters,__parameter_end,
__number,__string, __number,__string,
__scalar,__scalars,__scalar_end, __scalar,__scalars,__scalar_end,
__list,__hash, __list,__list_end,
__hash_member,__hash_members,__hash_member_end,__hash_suffix, __hash,__hash_end,
__hash_member,__hash_members,__hash_member_end,__hash_search,
__statement,__statements, __statement,__statements,
__function,//function(){} __function,__call_function,__call_function_end,//function(){}
__definition, __definition,
__assignment,__pre_assignment, __assignment,__pre_assignment,
__calculation, __calculation,
@ -227,10 +229,78 @@ struct cmp_seq
int res; int res;
}par[]= }par[]=
{ {
{{__var,__id,__equal,__string,__semi},__definition}, {{__left_bracket,__list_end}, __list},
{{__number}, __scalar}, {{__number,__list_end}, __list_end},
{{__var,__id,__equal,__scalar,__semi},__definition}, {{__id,__list_end}, __list_end},
{{__var,__id,__equal,__id,__semi}, __definition} {{__identifier,__list_end}, __list_end},
{{__string,__list_end}, __list_end},
{{__list,__list_end}, __list_end},
{{__hash,__list_end}, __list_end},
{{__comma,__number,__list_end}, __list_end},
{{__comma,__id,__list_end}, __list_end},
{{__comma,__identifier,__list_end}, __list_end},
{{__comma,__string,__list_end}, __list_end},
{{__comma,__list,__list_end}, __list_end},
{{__comma,__hash,__list_end}, __list_end},
{{__right_bracket}, __list_end},
{{__id,__colon,__number}, __hash_member},
{{__id,__colon,__id}, __hash_member},
{{__id,__colon,__identifier}, __hash_member},
{{__id,__colon,__string}, __hash_member},
{{__id,__colon,__list}, __hash_member},
{{__id,__colon,__hash}, __hash_member},
{{__left_brace,__hash_end}, __hash},
{{__hash_member,__hash_end}, __hash_end},
{{__comma,__hash_member,__hash_end}, __hash_end},
{{__right_brace}, __hash_end},
{{__id,__dot,__hash_search}, __hash_search},
{{__identifier,__dot,__hash_search}, __hash_search},
{{__identifier}, __hash_search},
{{__id}, __hash_search},
{{__call_function}, __identifier},
{{__id,__left_bracket,__number,__right_bracket}, __identifier},
{{__id,__left_bracket,__id,__right_bracket}, __identifier},
{{__id,__left_bracket,__identifier,__right_bracket}, __identifier},
{{__id,__left_curve,__call_function_end}, __call_function},
{{__number,__call_function_end}, __call_function_end},
{{__id,__call_function_end}, __call_function_end},
{{__identifier,__call_function_end}, __call_function_end},
{{__string,__call_function_end}, __call_function_end},
{{__list,__call_function_end}, __call_function_end},
{{__hash,__call_function_end}, __call_function_end},
{{__function,__call_function_end}, __call_function_end},
{{__comma,__number,__call_function_end}, __call_function_end},
{{__comma,__id,__call_function_end}, __call_function_end},
{{__comma,__identifier,__call_function_end}, __call_function_end},
{{__comma,__string,__call_function_end}, __call_function_end},
{{__comma,__list,__call_function_end}, __call_function_end},
{{__comma,__hash,__call_function_end}, __call_function_end},
{{__comma,__function,__call_function_end}, __call_function_end},
{{__right_curve}, __call_function_end},
{{__var,__id,__equal,__number,__semi}, __definition},
{{__var,__id,__equal,__id,__semi}, __definition},
{{__var,__id,__equal,__identifier,__semi}, __definition},
{{__var,__id,__equal,__string,__semi}, __definition},
{{__var,__id,__equal,__list,__semi}, __definition},
{{__var,__id,__equal,__hash,__semi}, __definition},
{{__var,__id,__equal,__hash_search,__semi}, __definition},
{{__var,__id,__equal,__number,__semi}, __assignment},
{{__var,__id,__equal,__id,__semi}, __assignment},
{{__var,__id,__equal,__identifier,__semi}, __assignment},
{{__var,__id,__equal,__string,__semi}, __assignment},
{{__var,__id,__equal,__list,__semi}, __assignment},
{{__var,__id,__equal,__hash,__semi}, __assignment},
{{__var,__id,__equal,__hash_search,__semi}, __assignment},
{{__definition}, __statement},
{{__assignment}, __statement}
}; };
int num_of_par=sizeof(par)/sizeof(cmp_seq); int num_of_par=sizeof(par)/sizeof(cmp_seq);
@ -245,7 +315,12 @@ class PDA
private: private:
std::stack<parse_unit> main_stack; std::stack<parse_unit> main_stack;
std::stack<parse_unit> error_stack; std::stack<parse_unit> error_stack;
bool stack_running_problem_check;
public: public:
PDA()
{
stack_running_problem_check=false;
}
void stack_input(std::stack<parse_unit>& temp) void stack_input(std::stack<parse_unit>& temp)
{ {
while(!temp.empty()) while(!temp.empty())
@ -286,6 +361,15 @@ class PDA
} }
bool extend_comp_progress(const int type) bool extend_comp_progress(const int type)
{ {
static int depth=0;
++depth;
if(stack_running_problem_check)
return false;
if(depth==1024)
{
stack_running_problem_check=true;
return false;
}
std::stack<parse_unit> recognized_stack; std::stack<parse_unit> recognized_stack;
std::stack<parse_unit> comp_stack; std::stack<parse_unit> comp_stack;
parse_unit temp; parse_unit temp;
@ -313,8 +397,6 @@ class PDA
recognized_stack.push(main_stack.top()); recognized_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
} }
else if(comp_stack.top().type==__null_end)
comp_stack.pop();
else if(comp_stack.top().type!=main_stack.top().type) else if(comp_stack.top().type!=main_stack.top().type)
{ {
if(!extend_comp_progress(comp_stack.top().type)) if(!extend_comp_progress(comp_stack.top().type))
@ -332,12 +414,12 @@ class PDA
} }
if(comp_stack.empty()) if(comp_stack.empty())
{ {
while(!recognized_stack.empty()) --depth;
recognized_stack.pop();
return true; return true;
} }
} }
} }
--depth;
return false; return false;
} }
void main_comp_progress() void main_comp_progress()
@ -371,12 +453,15 @@ class PDA
recognized_stack.push(main_stack.top()); recognized_stack.push(main_stack.top());
main_stack.pop(); main_stack.pop();
} }
else if(comp_stack.top().type==__null_end)
comp_stack.pop();
else if(comp_stack.top().type!=main_stack.top().type) else if(comp_stack.top().type!=main_stack.top().type)
{ {
if(!extend_comp_progress(comp_stack.top().type)) if(!extend_comp_progress(comp_stack.top().type))
{ {
if(stack_running_problem_check)
{
std::cout<<">>[Parse] Stack out of range in line "<<main_stack.top().line<<std::endl;
return;
}
while(!recognized_stack.empty()) while(!recognized_stack.empty())
{ {
main_stack.push(recognized_stack.top()); main_stack.push(recognized_stack.top());
@ -402,6 +487,7 @@ class PDA
main_stack.pop(); main_stack.pop();
} }
} }
std::cout<<"[Parse] Complete checking."<<std::endl;
print_error(); print_error();
return; return;
} }
@ -412,7 +498,7 @@ class nasal_parser
private: private:
std::stack<parse_unit> parser; std::stack<parse_unit> parser;
public: public:
void parse_quiet_process(std::list<token>& lexer) void parse_process(std::list<token>& lexer)
{ {
while(!parser.empty()) while(!parser.empty())
parser.pop(); parser.pop();