编译原理实验报告:实验一编写词法分析程序_第1页
编译原理实验报告:实验一编写词法分析程序_第2页
编译原理实验报告:实验一编写词法分析程序_第3页
编译原理实验报告:实验一编写词法分析程序_第4页
编译原理实验报告:实验一编写词法分析程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 编译原理实验报告实验名称:实验一编写词法分析程序实验类型:验证型实验指导教师:何 中 胜专业班级:13软件四姓 名:丁越学 号:13030504电子邮箱:862245792实验地点:秋白楼B720实验成绩: 日期:2016年 3 月 18 日一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生

2、源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。二、实验过程以编写PASCAL子集的词法分析程序为例1.理论部分(1)主程序设计考虑主程序的说明部分为各种表格和变量安排空间。数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。id和ci数组分别存放标识符和常数。instring数组为输入源程序的单词缓存。outtoken记录为输出内部表示缓存。还有一些为造表填表设置的变量

3、。主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。词法分析过程考虑将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图 1-1。图1-1该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记

4、录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数变为二进制形式存入数组中 ci中,并记录其在表中的位置。lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程,输出错误编号。2.实践部分所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为t,第二个字节为i。t为单词的种类。关键字的t=1;分界符的 t=2;算术运算符的t=3;关系运算符的t=4;无符号数的t=5;标识符的 t=6。i为该单词在各自表中的指针或内部码值。表 1-1为关键字表;

5、表1-2为分界符表;表1-3为算术运算符的i值;表1-4为关系运算符的i值。关键字表指针l关键字0BEGIN1DO2ELSE3EN4IF5THEN6VAR7WHILE表1-1分界符表指针l分界符0,1;2。3:=4(5)6:7"表1-2算术运算符指针l算术运算符10H+11H-20H*21H/表1-3关系运算符指针l关系运算符00H<01H<=02H=03H>04H>=05H<>表1-4常数表和标识符表是在编译过程中建立起来的。其 i值是根据它们在源程序中出现的顺序确定的。另外可以根据Pascal语言子集中出现其它单词情况进行自行修改以上表格。最后

6、编写程序进行词法分析,判断目标在哪个表中并进行显示。3、 实验结果1.测试数据数据共分为3组,分别如下:第一组数据var i,j,k:integer;begin i:=5; j:=6; k:=i+j; write("k=",k);End.第二组数据var i,sum:integer;begin sum:=0; for i:=1 to 10 do begin sum:=sum+i; end; writeln("sum=",sum);End.第三组数据var weight,price:real;begin write("please input w

7、eight: "); readln(weight); if weight<10 then price=5; else price=5+(weight-10)*0.4; writeln("price=",price);End.这三组数据都是通过文件“test.txt”读入到程序中,通过程序一一读取文件中的数据进行分析,程序分析时要注意所属的类型。2. 测试结果以上三组数据测试结果通过控制台显示,显示时要根据表进行分类,不同的表有不同的标号,具体显示如图1-1,1-2,1-3,和1-4所示:第一组数据图1-2第二组数据图1-3第三组数据图1-4图1-4(接图1-

8、5)4、 讨论与分析实验结果的每一条数据可分为两个部分。第一个部分是识别出的单词部分,第二个部分(小括号内的部分)则显示了单词在表中的位置,括号内第一个数字表示是第几张表,第二个数字代表单词在表的位置。实验结果与预期结果一致。该实验证明了通过其他语言来编译一种语言的词法分析器是可行的。实验结果说明了词法分析是作为相对独立的阶段来完成的。在词法分析过程中,编译程序是通过操作系统从外部介质中读取源程序文件中的各个字符的。同时,为正确地识别单词,有时还需进行超前搜索和回退字符等操作。因此,为了提高读盘效率和便于扫描器进行工作,通常可采用缓冲输入的方案,即在内存中设置一个适当大小的输入缓冲区,让操作系

9、统直接将磁盘上的源程序字符串分批送入此缓冲区中,供扫描器进行处理。5、 附录:关键代码部分如下:bool isKey( string str, int &syn) /*判断是否为关键字,若是传回相应关键码的种别名*/int i;for(i=0; i<7; i+)if(str = keyi)syn = i + 1;return true;return false;bool isLetter(char c) /判断是否为字母,若是返回true,不是返回false if(c >= 'A' && c <= 'Z') | (c &

10、gt;= 'a' && c <= 'z')return true;elsereturn false; bool isDigit(char c) /判断是否为数字,若是返回true,不是返回falseif(c >= '0' && c <= '9')return true;elsereturn false;void analyse(FILE *fileP)/分析函数对具体情形进行分析int n;char c;string str = ""int count=0;/标

11、识变量int count1=0;/标识变量while(c = fgetc(fileP) != EOF)if(c = ' ' | c = 'n' | c = 't')continue;else if(isDigit(c) /如果是数字while(isDigit(c)/数字后还是数字str += c;/数值连接c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);for(int a=0;a<50;a+)/数字没出现在数组中,在数组中加入if(arr1a=str)break;else if(arr1a="

12、;")arr1count1=str;count1+;break;for(int b=0;b<50;b+)/数字的分析if(arr1b=str)cout <<str<< "(5, " << ""<< b << "" << ")" << endl;str = ""else if(isLetter(c) /字母开头的while(isDigit(c) | isLetter(c)/字母后还是字母str +=

13、 c;c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);if(isKey(str, n)/如果是关键码cout <<str<< "(" << 1 << ", " << n << ")" << endl; /关键码分析elsefor(int i=0;i<50;i+)/标识符没出现在数组中,在数组中加入if(arri=str)break;else if(arri="")arrcount=str

14、;count+;break;for(int j=0;j<50;j+)/标识符分析if(arrj=str)cout <<str<< "(6, " << ""<< j << "" << ")" << endl;str = ""else /操作符等字符,为表2,3,4中的switch(c)./列举出现在表2,3,4中的字符进行分析,此处略int main()/主函数FILE *fileP;fileP = fopen("test.txt", "r");/读文件cout << "-词法分析如下-" << endl;analyse(fileP);/调用函数an

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论