#include #include #include #include enum token_type { S=1,a,T,__tri,__comma,__left_curve,__right_curve,sharp }; const int max_len=5; struct cmp_seq { int tokens[max_len]; int res; }; cmp_seq par[]= { {{a}, S}, {{__tri}, S}, {{__right_curve,T,__left_curve}, S}, {{S}, T}, {{T,__comma,T}, T}, }; int num_of_par=sizeof(par)/sizeof(cmp_seq); void print_token(int type) { std::string context=""; switch(type) { case sharp: context="#"; break; case S: context="S"; break; case a: context="a"; break; case T: context="T"; break; case __tri: context="^"; break; case __comma: context=","; break; case __left_curve: context="("; break; case __right_curve: context=")"; break; } std::cout< main_stack; std::stack comp_stack; public: PDA(std::string& text) { main_stack.push(sharp); for(int i=0;i<(int)text.length();++i) { if(text[i]=='(') main_stack.push(__left_curve); else if(text[i]==')') main_stack.push(__right_curve); else if(text[i]=='a') main_stack.push(a); else if(text[i]=='^') main_stack.push(__tri); else if(text[i]==',') main_stack.push(__comma); } comp_stack.push(sharp); } void print_stack(std::stack& temp) { std::stack t; while(!temp.empty()) { t.push(temp.top()); print_token(t.top()); temp.pop(); } while(!t.empty()) { temp.push(t.top()); t.pop(); } return; } void print_main_and_comp() { print_stack(main_stack); std::cout<<" "; print_stack(comp_stack); std::cout< temp; for(int i=0;i=0;--j) { if(!par[i].tokens[j]) continue; // if par[i].tokens[j] is 0 then continue until the tokens[j] is not 0 temp.push(comp_stack.top()); comp_stack.pop(); if((par[i].tokens[j]!=temp.top()) || (comp_stack.empty() && par[i].tokens[j])) { while(!temp.empty()) { comp_stack.push(temp.top()); temp.pop(); } break; } if((par[i].tokens[j]==temp.top()) && (j==0)) { comp_stack.push(par[i].res); return true; } } } return false; } void work() { print_main_and_comp(); while(main_stack.top()!=sharp) { comp_stack.push(main_stack.top()); main_stack.pop(); while(1) { if(!reducable()) break; print_main_and_comp(); } } print_main_and_comp(); if(comp_stack.top()==T) { comp_stack.pop(); if(comp_stack.top()==sharp) std::cout<<"accept."<>text; PDA m(text); m.work(); } return 0; }