正则分析的程序实现.docx
- 文档编号:28534181
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:28
- 大小:18.73KB
正则分析的程序实现.docx
《正则分析的程序实现.docx》由会员分享,可在线阅读,更多相关《正则分析的程序实现.docx(28页珍藏版)》请在冰豆网上搜索。
正则分析的程序实现
#include
#include
#include
usingnamespacestd;
intNFASNum;//NFA状态数
vector
stringstr2;
intAccept[100]={0};
//边类
classEdge
{
public:
intnum;
intpos;
charweight;
Edge*next;
public:
Edge()
{
num=-1;
pos=-1;
next=NULL;
}
Edge(intNum,intPos,charch)
{
num=Num;
pos=Pos;
weight=ch;
next=NULL;
}
};
//顶点类
classVertex
{
public:
intvnum;
Vertex*next;
Edge*out;
public:
Vertex()
{
vnum=-1;
next=NULL;
out=NULL;
}
Vertex(intnum)
{
vnum=num;
next=NULL;
out=NULL;
}
};
//邻接表类
classAdjacentT
{
private:
Vertex*Start;
intNumV;
intNumE;
public:
AdjacentT()
{
NumV=1;
NumE=0;
Start=newVertex();
}
~AdjacentT()
{
Vertex*V;
Edge*E;
V=Start;
for(inti=0;i { E=V->out; while(E) { V->out=E->next; deleteE; E=V->out; } V=V->next; } } intGetval(intpos)//得到顶点值 { Vertex*V=Start; for(inti=0;i { V=V->next; } returnV->vnum; } intGetpos(intval)//得到顶点位置 { Vertex*V=Start; inttemp=-1; for(inti=0;i { if(V->vnum==val) { temp=i; break; } V=V->next; } returntemp; } charGetwei_pos(intv1,intv2)//得到边权值 { charch='$'; Vertex*V=Start; for(inti=0;i { V=V->next; } Edge*E=V->out; while(E) { if(E->pos==v2) { ch=E->weight; break; } else { E=E->next; } } returnch; } charGetwei_val(intval1,intval2) { returnGetwei_pos(Getpos(val1),Getpos(val2)); } intSetval(intval,intpos)//赋予顶点值 { Vertex*V=Start; for(inti=0;i { V=V->next; } V->vnum=val; return0; } intInsertver(intval)//插入顶点值 { intpos; pos=Getpos(val); Vertex*V=Start; while(V->next) { V=V->next; } Vertex*NewV=newVertex(val); V->next=NewV; NumV++; return0; } intInsertedge_pos(intv1,intv2,charwei)//两定点之间插入边 { Vertex*V=Start; for(inti=0;i { V=V->next; } Edge*E; E=V->out; Edge*NewE=newEdge(Getval(v2),v2,wei); if(! E) { V->out=NewE; NumE++; return0; } while((E->pos! =v2)&&(E->next)) { E=E->next; } if(! E->next) { E->next=NewE; NumE++; } return0; } intInsertedge_val(intval1,intval2,charwei) { intv1=Getpos(val1); intv2=Getpos(val2); Insertedge_pos(v1,v2,wei); return0; } intPrint_NFA()//输出NFA { Vertex*V=Start; Edge*E=newEdge(); cout<<"状态边(权值)"< for(inti=0;i { cout< E=V->out; if(E) { while(E) { cout<<""< E=E->next; } } else { cout<<"ACC"; } cout< V=V->next; } return0; } intPrint_DFA()//输出DFA { Vertex*V=Start; Edge*E=newEdge(); cout<<"状态边(权值)是否ACC"< for(inti=0;i { E=V->out; if(E) { cout< while(E) { cout< E=E->next; } if(Accept[V->vnum]==1) cout<<"ACC"; cout< } V=V->next; } return0; } int*Closure(int*T)//闭包运算 { inti=0,j,k=0,len=0; int*temp=newint[100]; Vertex*V; Edge*E; while(T[len]! =-1) { len++; } while(T[i]! =-1) { intl; for(l=0;l { if(T[i]==temp[l]) { break; } } if(l==k) { temp[k]=T[i]; k++; } intpos=Getpos(T[i]); V=Start; for(j=0;j { V=V->next; } E=V->out; while(E) { if(E->weight=='~') { for(l=0;l { if(E->num==temp[l]) { break; } } if(l==k) { temp[k]=E->num; k++; T[len++]=E->num; T[len]=-1; } } E=E->next; } i++; } //for(inti=0;T[i]! =-1;i++) //cout< //cout< temp[k]=-1; //for(intr=0;temp[r]! =-1;r++) //cout< //rec.push_back(temp); //for(inti=0;i //{ //for(intj=0;rec[i][j]! =-1;j++) //cout< //} //cout< returntemp; } }; structNode{ intStart; intEnd; charWei; };//记录链表节点 vector vector AdjacentT*NFA_T=newAdjacentT(); AdjacentT*DFA_T=newAdjacentT(); intGetRE(stringRexp) { cout<<"你输入的正则表达式是: "< return0; } intSymbolPriority(charsymbol)//算符优先级 { intpriority; switch(symbol) { case'|': priority=1;break; case'.': priority=2;break; case'*': priority=3;break; default: priority=0;break; } returnpriority; } stringInsertCatNode(stringRexp)//插入连接运算符 { inti=0,len=Rexp.length(); string: : iteratorit=Rexp.begin(); while(it! =Rexp.end()-1) { if(((*it! ='('&&*it! ='.'&&*it! ='|') ||*it==')' ||*it=='*') &&(*(it+1)! =')'&&*(it+1)! ='.'&&*(it+1)! ='|'&&*(it+1)! ='*')) { Rexp.insert(it+1,'.'); len=Rexp.length(); } it=Rexp.begin(); i++; it=it+i; } cout<<"加入连结点: "< returnRexp; } intGetAlphabet(stringstr)//的到字母集合 { stringstr1; for(inti=0;i { if(str[i]! ='*'&&str[i]! ='|'&&str[i]! ='.'&&str[i]! ='('&&str[i]! =')') str1+=str[i]; } boolflag=false; for(inti=0;i { for(intj=0;j { if(str1[j]==str1[i]) { flag=true; break; } else flag=false; } if(flag==false) str2+=str1[i]; } cout<<"字母表为: "< return0; } stringGerRegExpToPost(stringRexp)//得到逆波兰式 { inti=0; intj=0; stack stringstrpost; s.push('$'); charch1,ch2; ch1=Rexp[i]; while(ch1! ='\0') { if(ch1=='(') { s.push(ch1); ch1=Rexp[++i]; } elseif(ch1==')') { while(s.top()! ='(') { strpost+=s.top(); s.pop(); } s.pop(); ch1=Rexp[++i]; } elseif((ch1=='|')||(ch1=='*')||(ch1=='.')) { ch2=s.top(); while(SymbolPriority(ch2)>=SymbolPriority(ch1)) { strpost+=ch2; s.pop(); ch2=s.top(); } s.push(ch1); ch1=Rexp[++i]; } else { strpost+=ch1; ch1=Rexp[++i]; } } //cout< ch1=s.top(); s.pop(); while((ch1=='|')||(ch1=='*')||(ch1=='.')) { strpost+=ch1; ch1=s.top(); s.pop(); } cout<<"转为后缀式: "< returnstrpost; } intThompsonConstrucNFA(stringRexp)//构造NFA { inti,j; charch; ints1,s2; stack NFA_T->Setval(0,0); i=1; j=0; ch=Rexp[j]; while(ch! ='\0') { if(ch=='.') { s2=s.top(); s.pop(); inttemp1=s.top(); s.pop(); inttemp2=s.top(); s.pop(); s1=s.top(); s.pop(); NFA_T->Insertedge_val(temp2,temp1,'~'); s.push(s1); s.push(s2); } elseif(ch=='|') { s2=s.top(); s.pop(); inttemp1=s.top(); s.pop(); inttemp2=s.top(); s.pop(); s1=s.top(); s.pop(); NFA_T->Insertver(i); NFA_T->Insertver(i+1); NFA_T->Insertedge_val(i,s1,'~'); NFA_T->Insertedge_val(i,temp1,'~'); NFA_T->Insertedge_val(temp2,i+1,'~'); NFA_T->Insertedge_val(s2,i+1,'~'); s1=i; s2=i+1; s.push(s1); s.push(s2); i+=2; } elseif(ch=='*') { s2=s.top(); s.pop(); s1=s.top(); s.pop(); NFA_T->Insertver(i); NFA_T->Insertver(i+1); NFA_T->Insertedge_val(i,i+1,'~'); NFA_T->Insertedge_val(s2,s1,'~'); NFA_T->Insertedge_val(i,s1,'~'); NFA_T->Insertedge_val(s2,i+1,'~'); s1=i; s2=i+1; s.push(s1); s.push(s2); i+=2; } else { NodeN; NFA_T->Insertver(i); NFA_T->Insertver(i+1); NFA_T->Insertedge_val(i,i+1,ch); N.Start=i; N.End=i+1; N.Wei=ch; p.push_back(N); s1=i; s2=i+1; s.push(s1); s.push(s2); i+=2; } j++; ch=Rexp[j]; } s2=s.top(); s.pop(); s1=s.top(); s.pop(); NFA_T->Insertedge_val(0,s1,'~'); NFASNum=s2+1; NFA_T->Print_NFA(); return0; } boolcmp(vector { for(inti=0;i { if(v[i]! =s[i]) returntrue; } returnfalse; } intCmpArray(vector { vector vector for(inti=0;t2[i]! =-1;i++) { s.push_back(t2[i]); } intflag[rec.size()]; for(intr=0;r { v.clear(); for(intk=0;rec[r][k]! =-1;k++) { v.push_back(rec[r][k]); } if(v.size()==s.size()) { if(cmp(v,s)) flag[r]=1; else flag[r]=0; } else flag[r]=1; } for(inti=0;i { if(flag[i]==0) { returni; } } return-1; } intSubSetConstruction()//构造DFA { vector intT[1000]; T[0]=0; T[1]=-1; rec.push_back(NFA_T->Closure(T)); intk=0; for(intk=0;k { for(inti=0;i { for(intj=0;j { if(str2[i]==p[j].Wei) { for(intr=0;rec[k][r]! =-1;r++) { //cout< if(rec[k][r]==p[j].Start) { q.push_back(p[j].End); } } } } for(intl=0;l { T[l]=q[l]; //cout< } T[q.size()]=-1; NodeN; inttemp=CmpArray(rec,NFA_T->Closure(T)); //cout<<"++++++++"< if(CmpArray(rec,NFA_T->Closure(T))==-1&&NFA_T->Closure(T)[0]! =-1) { rec.push_back(NFA_T->Closure(T)); DFA_T->Insertve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 分析 程序 实现