还剩2页未读,继续阅读
文本内容:
编译原理实验报告词法分析程序的设计一一NFA转换为DFA理解并掌握NFA转换实验名称为DFA的实现过程实验目的1)实验过程实验方案2)输入NFA状态表以及转换状态(L,D),将每一个状态转换表以链表的形式的链接起来,以栈的形式存储;3)输入初始状态,求取该状态的£闭包,以及在状态转换下的DFA集合,当求得DFA后,以该DFA为新的NFA集合,求新的£闭包,直到到达最后状态或进入重复循环,则求另一个状态转换下的DFA集合;4)输出NFA在转换状态的DFA集合;求取£闭包实验记录Node*Closure(Node*closure,int state,Node*List){closure表示存储闭包的链表,state是闭包的最初元素,Li st是查找的链表Node*Tip=Node*mallocsizeofNode;Node*newNode二Node*mallocsizeofNode;Tip=List;while Tip!=NULL{if state==Tip-StartTip-Sign==〃*〃{newNode-Start=Tip-End;newNode-next二closure-next;closure-next=newNode;closure=Closure closure,Tip-End,List;Tip=Tip-next;}return closure;转换的实现过程NFA DFANode*NFAtoDFANode*NFA,Node*List,string change{〃NFA表示最初状态集合,List表示查找的链表,change表示转换条件Node*flag=Node*mallocsizeofNode;Node*DFA=Node*mallocsizeofNode;Node*newNode1=Node*mallocsizeofNode;Node*newNode2=Node*mallocsizeofNode;newNode2=NFA;DFA-next=NULL;while newNode2!=NULL{flag=List;while flag!=NULL{if newNode2-Start二二List-StartList-Sign二二changenewNodel-Start二List-End;newNodel-next=DFA-next;DFA-next=newNodel;DFA=ClosureDFA,List-End,List;flag二flag-next;}newNode2=newNode2-next;return DFA;问题解决代码void solveNode*NFA,Node*List,string transition[],int number2{Node*DFA=Node*mallocsizeofNode;Node*newNodel=Node*mallocsizeofNode;Node*newNode2=Node*mallocsizeofNode;int*array1=new int[VOLUME];int*array2=new int[VOLUME];int lengthl,length2;bool flag;for inti=0;inumber2;i++{DFA=NFAtoDFANFA,List,transition[i];lengthl=lengthNFA,arrayl;length2=length DFA,array2;if lengthl==length2{while lengthl0{if arrayl[lengthl]二二array2[lengthl]{lengthl--;flag=1;continue;}else{flag=0;break;}else flag=0;newNodel=NFA;newNode2=DFA;cout〃NFA:〃;while newNodel!=NULL{coutnewNodel-Start〃〃;newNodel=newNodel-next;couttransfer:“transition[i]〃〃;cout〃DFA:〃;while newNode2!=NULL{coutnewNode2-Start〃〃;newNode2=newNode2-next;cout〃\n〃;if flag==0solveDFA,List,transition,number2;输入输出结果:通过本次实验,了解和熟悉了NFA转换DFA的过程,在实验开始之前,需实验总结要对转换过程有清楚的了解,找到合适的方法处理转换终止和转换重复的情况,同时要清晰准确的输入条件可以简化一定的程序处理过程,在本次实验中,对同一状态的重复是所面临的处理困难,通过解决问题,并实际动手操作加强了自己的动手能力,也加深了对NFA到DFA装换的掌握。