1 / 18
文档名称:

中南大学编译原理实验报告.docx

格式:docx   大小:974KB   页数:18页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

中南大学编译原理实验报告.docx

上传人:bai1968104 2020/9/11 文件大小:974 KB

下载得到文件列表

中南大学编译原理实验报告.docx

文档介绍

文档介绍:CENTRALSOUTHUNIVERSITY编译原理实验报告学生姓名专业班级学号学院信息科学与工程学院指导教师张修如实验时间2015年5月实验一计算FIRSTVT集一、实验目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC /JAVA/C#/.NET 。二、实验内容设计一个由正规文法生成FIRSTVT集的算法动态模拟,实现以下功能:; ;。三、,采用合适的数据存储结构等;,程序整体结构合理、编程风格规范等; ,包括功能的基本实现、基本完善、完全实现;    、独立完成实验。四、:充分地分析和理解问题本身,弄清要求做什么; :主要是找到解决问题的主要思路,该怎么做;:确定算法的主要流程,再进行编程;:掌握程序调试和排错的基本方法,增加编程的感觉和解决问题的成就感;。五、 构造集合FIRSTVT(P)的算法 按FIRSTVT(P)的定义,可以用如下两条归则来构造: (1)若有产生式P→a…或→Qa…,则a∈FIRSTVT(P) (2)若a∈FIRSTVT(Q),且有产生式P→Q…,则a∈FIRSTVT(P) 构造算法: 建立一个二维布尔数组F[P,a],使得F[P,a]为真的条件适当且仅当a∈FIRSTVT(P);再用一个栈STACK,把所有初值为真的数组元素F[P,a]的符号对(P,a)全都放到栈中;算法如下: (1)将布尔矩阵各元素置假;栈置空; (2)按照归则(1)查看产生式,对于P→a…或P→Qa..,置相应F[P,a]为真,符号对(P,a)入栈; (3)按规则(2),对栈施加如下操作:弹出栈定符号对记作(Q,a),查看所有产生式是否有形如P→Q…产生式,若有,且a∈FIRSTVT(P),则将F[P,a]置为真,并把(P,a)入栈; (4)重复(3),直到栈空为止。   在程序中,用两个字符数组vn[M]和vt[N]分别用来存储所有的非终结字符集与终结字符集。为了记录非终结符的FIRSTVT集,为此建立一个布尔数组F[M][N],记录非终结符的FIRSTVT集。比如,F[i][j]=true表示vt[j]属于FIRSTVT(vn[i]),值为false表示相应的终结符不属于非终结符的FIRSTVT集。 为了简便起见,程序中又构造了一个两维布尔数组first[M][M+N]来表示推导关系。数组第一维的M个字符代表非终结符;数组第二维的前M个字符代表非终结符,后N个字符代表终结符。以first数组为例,fist[i][M+j]代表非终结符vn[i]=P与非终结符vt[j]=a有推导关系P →a…;fist[i][j]代表非终结符vn[i]=P与非终结符vt[j]=Q有推导关系或P→Qa..。  相关的数据结构定义如下: char vn[M],vt[N];  //非终结字符与终结字符数组 bool first[M][M+N],last[M][M+N]; //以布尔数组形式定义推导关系 char vn[M],vt[N];  //非终结字符与终结字符数组 int stp; //堆栈栈顶指针 符号栈的数据结构: struct relation{   int vn;   int vt; };  //结构体用来说明终结符vt与非终结符vn之间的关系,若关系存在说明vt属于FIRSTVT(vn) 六、关键代码#include<>#include<iostream>#defineN10#defineM10usingnamespacestd;//用于存储FIRSTVT集charFIRSTVT0[N],FIRSTVT1[N],FIRSTVT2[N],FIRSTVT3[N],FIRSTVT4[N];//接受输入charINPUT[N][M];//存储FIRSTVT集voidsetFIRSTVT(charX,intT){}voidFIRSTVT(charX,intS){}voidmain(){inti,j;printf("请输入文法(按两次回车结束):\n");for(i=0;i<N;i++){for(j=0;j<M;j++){scanf("%c",&INPUT[i][j]);if(INPUT[i][j]=='\n')break;}if(INPUT[i][