diff --git a/version0.7/lr_pda_demo.cpp b/version0.7/lr_pda_demo.cpp new file mode 100644 index 0000000..4ee3972 --- /dev/null +++ b/version0.7/lr_pda_demo.cpp @@ -0,0 +1,179 @@ +#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; +}