12-3-19:00 实验三 有限自动机的构造与识别
#include<iostream> #include<string.h> using namespace std; class grammer { private: int flag;//判别是NFA还是DFA的标识符 char K[50];//有穷非空状态集合 char E[50];//有穷非空的输入字母表 char str[50];//存放待识别的字符串 char ch[20][20];//存放从 K*E到 K的映射 public: char**p; //数组指针 int line; //确定行的位置 int m;//要识别的字符串长度 int VN;//控制非终结符号输出的变量 int VT;//控制终结符号输出的变量 int i,j; grammer() //构造函数 { int i; line=0; cout<<"输入要输入文法的个数:"<<endl; int n; //文法个数 cin>>n; line=n; //每输入一个规则,行作相应的变动 p=new char*[n]; //申请空间,用来存放规则 for(i=0;i<n;i++) for(i=0;i<n;i++) { p[i]=new char[50]; //用来存放第i个规则 } for( i=0;i<line;i++) for(int j=0;j<50;j++) //将所用的字符都用‘\0’字符填充 p[i][j]='\0'; //清空位置,用来存放文法 cout<<"输入文法:"<<endl; for( i=0;i<n;i++) //按行输入每一个文法规则 { cin>>p[i]; } for( i=0;i<20;i++) { for(int j=0;j<20;j++) { ch[i][j]='\0';//将存放映射的数组初始化 } } } //求出有穷非空的输入字母表 void zhongjie() { VT=0; for(int i=0;i<line;i++) for(int j=0;j<6;j++) { char temp=p[i][j]; if(!((temp>='A'&&temp<='Z'||temp==':'||temp=='='||temp=='\0')) { bool state=true; for(int k=0;k<VT;k++) { if(temp==E[k]) {state=false;break;} } if(state=true) E[VT++]=temp; } } } //求出有穷非空的状态集合 void Search_big() { VN=0; for(int i=0;i<line;i++) for(int j=0;j<6;j++) { char temp=p[i][j]; if(temp>='A'&&temp<='Z') { bool state=true; for(int k=0;k<VN;k++) { if(temp==K[k]) {state=false;break;} } if(state=true) K[VN++]=temp; } } } //输入待识别的字符串 void string() { for(i=0;i<50;i++) { str[i]='\0'; } cout<<"请输入要识别的字符串长度:\n"; cin>>m; cout<<endl; cout<<"请输入要识别的字符串:\n"; for(i=0;i<m;i++) { cin>>str[i]; } } //输出待识别的字符串 void print_s() { for(int k=0;k<m;k++) { cout<<str[K]; } cout<<")"; } //识别字符串 void shibie() { int count=0; char G='S'; print_1(); Search_big(); for(i=0;i<m;i++) { while(str[i]!='\0') { for(j=0;j<line;j++) { if(G==ch[j][2]&&str[i]==ch[j][4]) { G=ch[j][7]; if(G==K[0]) { cout<<"="; for(int s=0;s<6;s++) { cout<<ch[j][s]; } cout<<"="<<G; cout<<endl; break; } else { cout<<"="<<"M"<<"("; for(int s=0;s<6;s++) { cout<<ch[j][s]; } } int length=m; for(int t=0;t<length;t++) { str[t]=str[t+1]; } length--; cout<<","; for(int q=0;q<length;q++) { cout<<str[q]; } cout<<")"; cout++; } } } if(count==m) { cout<<"该文法可被识别!"; break; } else { cout<<"该文法不可被识别!"; break; } } } //输出映射集合 void print_1() { for(i=0;i<line;i++) { ch[i][0]='M'; ch[i][1]='('; ch[i][3]=','; ch[i][5]=')'; ch[i][6]='='; if((if((p[i][4]>='A'&&p[i][4]<='Z')&&(p[i][5]>='a'&&p[i][5]<='z')) { ch[i][2]=p[i][4];ch[i][4]=p[i][5];ch[i][7]=p[i][0]; } else if((p[i][4]>='a'&&p[i][4]<='z')&&(p[i][5]>='A'&&p[i][5]<='Z')) { ch[i][2]=p[i][5];ch[i][4]=p[i][4];ch[i][7]=p[i][0]; } else { ch[i][2]='S';ch[i][4]=p[i][4];ch[i][7]=p[i][0]; } } } //转换过程 void print_2() { print_1(); for(i=0;i<line;i++) { int x=8; for(int j=i+1;j<line;j++) { if(ch[i][2]==ch[j][2]&&ch[i][4]==ch[j][4]) { ch[i][x]=ch[j][7]; x++; for(int K1=j;K1<line;K1++) for(int K2=0;K2<=7;K2++) ch[K1][K2]=ch[K1+1][K2]; line--; } else break; } } } void print_D() { print_1(); cout<<"M:"<<endl; for(i=0;i<line;i++) { for(j=0;j<=7;j++) { cout<<ch[i][j]; if(j==7) cout<<endl; } } } void print_N() { print_2(); cout<<"M:"<<endl; for(i=0;i<line;i++) { for(j=0;j<7;j++) { cout<<ch[i][j]; } cout<<"{"; for(j=7;j<strlen(ch[i]);j++) {cout<<ch[i][j];} cout<<"}"<<endl; } } void print()//输出五元组 { Search_big(); cout<<"DFA N={{"<<"S"<<","; for(int i=0;i<VN-1;i++) { cout<<K[i]; cout<<","; } cout<<K[VN-1]; cout<<"}"<<","; zhongjie(); cout<<"}"; for(int j=0;j<VT-1;j++) { cout<<E[j]; cout<<','; } cout<<E[VT-1]; cout<<"}";<<","; cout<<"M"<<","; cout<<"S"<<","; cout<<"{"<<K[0]<<"}"<<")"<<endl; } void Identify() { for(i=0;i<=line-1;i++) { for(j=i+1;j<=line;j++) { char templ=p[i][4]; char temp2=p[i][5]; char temp3=p[j][4]; char temp4=p[j][5]; if(temp1==temp3&&temp2==temp4) { cout<<"该有穷状态自动机是NFA.\n"; print_N(); break; } else { cout<<"该有穷状态自动机是DFA.\n"; print_D(); break; } } } } }; int main() { grammer a; cout<<"-----------------------------------------\n"; cout<<"正规文法构造有穷状态自动机!\n"; cout<<"-----------------------------------------\n"; cout<<"输入完成,输出有穷状态自动机(五元组):"<<endl; cout<<endl; a.print(); a.Identify(); cout<<endl<<endl; cout<<"-----------------------------------------\n"; cout<<"运行有穷状态自动机!\n"; cout<<"-----------------------------------------\n"; a.string(); cout<<"有穷状态自动机DFA识别过程如下:\n\n"; cout<<"M"<<"("<<"S"<<","; a.print_s(); a.shibie(); system("pause"); }
运行结果:
posted on 2015-12-03 19:01 ganxiaoxiao 阅读(189) 评论(0) 编辑 收藏 举报