A demo for calculation is finished.
This commit is contained in:
parent
91d61b613e
commit
105de4234f
|
@ -0,0 +1,256 @@
|
|||
#include <list>
|
||||
#include <stack>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
|
||||
enum token_type
|
||||
{
|
||||
e=1,E,_E,T,_T,F,I,__add,__sub,__mul,__div,__left_curve,__right_curve,sharp
|
||||
};
|
||||
|
||||
const int max_len=3;
|
||||
struct cmp_seq
|
||||
{
|
||||
int tokens[max_len];
|
||||
int res;
|
||||
};
|
||||
cmp_seq par[]=
|
||||
{
|
||||
{{T,_E}, E},
|
||||
{{__add,T,_E}, _E},
|
||||
{{__sub,T,_E}, _E},
|
||||
{{e}, _E},
|
||||
{{F,_T}, T},
|
||||
{{__mul,F,_T}, _T},
|
||||
{{__div,F,_T}, _T},
|
||||
{{e}, _T},
|
||||
{{__left_curve,E,__right_curve},F},
|
||||
{{I}, F}
|
||||
};
|
||||
int num_of_par=sizeof(par)/sizeof(cmp_seq);
|
||||
|
||||
cmp_seq first_set[]=
|
||||
{
|
||||
{{__left_curve,I},E},
|
||||
{{__left_curve,I},T},
|
||||
{{__left_curve,I},F},
|
||||
{{__add,__sub,e},_E},
|
||||
{{__mul,__div,e},_T},
|
||||
};
|
||||
int num_of_set=sizeof(first_set)/sizeof(cmp_seq);
|
||||
|
||||
bool isEnd(int type)
|
||||
{
|
||||
return ((type==__left_curve) || (type==__right_curve) || (type==I) || (type==__add) || (type==__sub) || (type==__mul) || (type==__div) || (type==e) || (type==sharp));
|
||||
}
|
||||
bool isHead(int head,int type)
|
||||
{
|
||||
for(int i=0;i<num_of_set;++i)
|
||||
{
|
||||
if(type==first_set[i].res)
|
||||
{
|
||||
for(int j=0;j<max_len;++j)
|
||||
if(head==first_set[i].tokens[j])
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int correct_token_seq(int head,int type)
|
||||
{
|
||||
for(int i=0;i<num_of_par;++i)
|
||||
{
|
||||
if((type==par[i].res) && (isHead(head,par[i].tokens[0]) || (head==par[i].tokens[0])))
|
||||
return i;
|
||||
}
|
||||
for(int i=0;i<num_of_par;++i)
|
||||
{
|
||||
if((type==par[i].res) && (par[i].tokens[0]==e))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int place_operator_end(int type)
|
||||
{
|
||||
for(int i=0;i<num_of_par;++i)
|
||||
{
|
||||
if((type==par[i].res) && (par[i].tokens[0]==e))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void print_token(int type)
|
||||
{
|
||||
std::string str="";
|
||||
switch(type)
|
||||
{
|
||||
case e:
|
||||
str="e";
|
||||
break;
|
||||
case E:
|
||||
str="E";
|
||||
break;
|
||||
case _E:
|
||||
str="E\'";
|
||||
break;
|
||||
case T:
|
||||
str="T";
|
||||
break;
|
||||
case _T:
|
||||
str="T\'";
|
||||
break;
|
||||
case F:
|
||||
str="F";
|
||||
break;
|
||||
case I:
|
||||
str="i";
|
||||
break;
|
||||
case __add:
|
||||
str="+";
|
||||
break;
|
||||
case __sub:
|
||||
str="-";
|
||||
break;
|
||||
case __mul:
|
||||
str="*";
|
||||
break;
|
||||
case __div:
|
||||
str="/";
|
||||
break;
|
||||
case __left_curve:
|
||||
str="(";
|
||||
break;
|
||||
case __right_curve:
|
||||
str=")";
|
||||
break;
|
||||
case sharp:
|
||||
str="#";
|
||||
break;
|
||||
}
|
||||
std::cout<<str;
|
||||
return;
|
||||
}
|
||||
|
||||
class PDA
|
||||
{
|
||||
private:
|
||||
std::stack<int> main_stack;
|
||||
std::stack<int> comp_stack;
|
||||
public:
|
||||
PDA(std::string& text)
|
||||
{
|
||||
main_stack.push(sharp);
|
||||
for(int i=(int)text.length()-1;i>=0;--i)
|
||||
{
|
||||
if(text[i]=='(')
|
||||
main_stack.push(__left_curve);
|
||||
else if(text[i]==')')
|
||||
main_stack.push(__right_curve);
|
||||
else if(text[i]=='i')
|
||||
main_stack.push(I);
|
||||
else if(text[i]=='+')
|
||||
main_stack.push(__add);
|
||||
else if(text[i]=='-')
|
||||
main_stack.push(__sub);
|
||||
else if(text[i]=='*')
|
||||
main_stack.push(__mul);
|
||||
else if(text[i]=='/')
|
||||
main_stack.push(__div);
|
||||
}
|
||||
comp_stack.push(sharp);
|
||||
comp_stack.push(E);
|
||||
}
|
||||
void print_stack(std::stack<int>& temp)
|
||||
{
|
||||
std::stack<int> 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<<std::endl;
|
||||
return;
|
||||
}
|
||||
void work()
|
||||
{
|
||||
print_main_and_comp();
|
||||
while((main_stack.top()!=sharp) || (comp_stack.top()!=sharp))
|
||||
{
|
||||
if(!isEnd(comp_stack.top()))
|
||||
{
|
||||
if(isHead(main_stack.top(),comp_stack.top()))
|
||||
{
|
||||
int i=correct_token_seq(main_stack.top(),comp_stack.top());
|
||||
comp_stack.pop();
|
||||
for(int j=max_len-1;j>=0;--j)
|
||||
if(par[i].tokens[j])
|
||||
comp_stack.push(par[i].tokens[j]);
|
||||
}
|
||||
else if(!isHead(main_stack.top(),comp_stack.top()))
|
||||
{
|
||||
//to check if this can be extended as 'e'
|
||||
int i=place_operator_end(comp_stack.top());
|
||||
if(i!=-1)
|
||||
comp_stack.pop();
|
||||
else
|
||||
{
|
||||
std::cout<<"error."<<std::endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout<<"error."<<std::endl;
|
||||
return;
|
||||
}
|
||||
print_main_and_comp();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(main_stack.top()==comp_stack.top())
|
||||
{
|
||||
main_stack.pop();
|
||||
comp_stack.pop();
|
||||
}
|
||||
else if(comp_stack.top()==e)
|
||||
comp_stack.pop();
|
||||
else
|
||||
{
|
||||
std::cout<<"error."<<std::endl;
|
||||
return;
|
||||
}
|
||||
print_main_and_comp();
|
||||
}
|
||||
}
|
||||
std::cout<<"accept."<<std::endl;
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
std::string text;
|
||||
while(1)
|
||||
{
|
||||
std::cin>>text;
|
||||
PDA m(text);
|
||||
m.work();
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue