收藏 分销(赏)

有穷状态自动机.docx

上传人:pc****0 文档编号:6709653 上传时间:2024-12-20 格式:DOCX 页数:5 大小:70.03KB 下载积分:10 金币
下载 相关 举报
有穷状态自动机.docx_第1页
第1页 / 共5页
有穷状态自动机.docx_第2页
第2页 / 共5页


点击查看更多>>
资源描述
西北师范大学计算机科学与工程学院学生实验报告 学号 111111 专业 计算机科学与技术 班级 技师(1)班 姓名 111 课程名称 编译原理 课程类型 实验 实验名称 有穷状态自动机 实验目的: 1, 准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,为词法分析程序的自动构造寻找特殊的方法和工具; 2, 掌握了有穷状态自动转换机的概念; 3, 掌握DFA的存储表示; 4, 掌握DFA与正则文法的联系 实验原理: 1, 一个确定的有穷状态自动机DFA是五元组(K,∑,M,S,F,),其中, K是有穷非空的状态集合; ∑是有穷非空的输入字母表; M是从K×∑到K的映象。如果M(R,T)=Q,则输入字符为T时,当前状态R将转换到状态Q,Q成为下一当前状态; S是开始状态; F是非空的终止状态集合。 输入任意的正则文法,输出相应的有穷状态自动机 要求:识别有穷状态自动转换机是非确定的还是确定的,以相应的五元组形式输出。 实验代码如下: 实验源代码: #include <iostream> using namespace std; const int maxsize=10; class DFA { private: int M[maxsize][maxsize]; char Vn[maxsize],Vt[maxsize]; int VnNum,VtNum; public: DFA(); ~DFA(){} void print(); int move(char start,char s[]); }; int DFA::move(char start,char s[]) { char t[10];char next=start; int left=0,right=0,i=0,j=0; while(s[i]!='\0'){t[i]=s[i++];} t[i]='\0'; while(t[0]!='\0') { left=0;right=0; while(next!=Vn[left]){left++;} while(t[0]!=Vt[right]){right++;} if(M[left][right]!=-1&&left<VnNum&&right<VtNum) { next=Vn[M[left][right]]; cout<<"M("<<Vn[left]<<","<<Vt[right]<<")="<<next<<endl; } else return 0; i=1; while(t[i]!='\0'){t[i-1]=t[i++];} t[i-1]='\0'; } return 1; } DFA::DFA() { char grammar[maxsize],n[maxsize],t[maxsize]; int rule,left,right,final; int i=0,j=0,k=0; cout<<"rule=";cin>>rule; cout<<"Vn ";cin>>n; cout<<"Vt ";cin>>t; cout<<"grammar"; Vn[0]='S'; j=0; while(n[j]!='\0')Vn[j+1]=n[j++];VnNum=j+1; while(t[i]!='\0')Vt[i]=t[i++];VtNum=i; for(i=0;i<VnNum;i++) for(j=0;j<=VtNum;j++)M[i][j]=-1; i=0; while(i!=rule) { j=0;k=0; cin>>grammar; while(Vn[k]!=grammar[0])k++; final=k; while(grammar[j]!='\0')j++; if(j==2) { k=0; while(Vt[k]!=grammar[1])k++; left=0; right=k; } else { k=0;while(Vn[k]!=grammar[1])k++;left=k; k=0;while(Vt[k]!=grammar[2])k++;right=k; } M[left][right]=final; i++; } } void DFA::print() { int i=0,j=0; cout<<"DFA ({"; while(i!=VnNum){cout<<Vn[i++]<<",";}cout<<"},{"; while(j!=VtNum){cout<<Vt[j++]<<",";}cout<<"},M"<<endl; cout<<"{"<<endl; i=0; while(i!=VnNum) { j=0; while(j!=VtNum) { if(M[i][j]!=-1) { cout<<"M("<<Vn[i]; cout<<","<<Vt[j]<<")="<<Vn[M[i][j]]<<endl; } j++; } i++; } cout<<"},{"<<Vn[0]<<"},{"<<Vn[1]<<"}"; }; int main() { char t[10]; int i; cout<<"------------------------------------------------"<<endl; cout<<"---1.DFA构造,2.打印五元组,3.接受字符串,4.退出---"; cin>>i;DFA s; while(i<=3) { //system("color 1e"); if(i==2)s.print(); if(i==3) {cout<<"输入串"; cin>>t;if(s.move('S',t))cout<<"字符串"<<t<<"可以被该DFA所接收"; else cout<<"字符串"<<t<<"不能被该DFA所接收";} cout<<"\n输入操作"; cin>>i; } system("pause"); } 实验结果: 实验总结: 通过本次实验,对有穷状态自动转换机有了更进一步的了解,掌握了其存储表示与正则文法的联系,并且通过对整个程序的阅读,知道了任意的正则文法如何以五元组的形式输出。能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合.通过本次实验,对有穷状态自动机的概念、其存储表示及其正则文法的联系,有了进一步的理解和认识,增强了动手能力和编程能力。 实验成绩 教师签名
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服