编译原理实验报告:实验一编写词法分析程序

上传人:第*** 文档编号:33595425 上传时间:2018-02-16 格式:DOC 页数:12 大小:179.50KB
返回 下载 相关 举报
编译原理实验报告:实验一编写词法分析程序_第1页
第1页 / 共12页
编译原理实验报告:实验一编写词法分析程序_第2页
第2页 / 共12页
编译原理实验报告:实验一编写词法分析程序_第3页
第3页 / 共12页
编译原理实验报告:实验一编写词法分析程序_第4页
第4页 / 共12页
编译原理实验报告:实验一编写词法分析程序_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《编译原理实验报告:实验一编写词法分析程序》由会员分享,可在线阅读,更多相关《编译原理实验报告:实验一编写词法分析程序(12页珍藏版)》请在金锄头文库上搜索。

1、 编 译 原 理 实 验 报 告实验名称: 实验一编写词法分析程序实验类型: 验证型实验指导教师: 何 中 胜专业班级: 13 软件四姓 名: 丁越学 号: 13030504电子邮箱: 实验地点: 秋白楼 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;无

5、符号数的 t=5;标识符的 t=6。i 为该单词在各自表中的指针或内部码值。表 1-1 为关键字表;表 1-2 为分界符表;表 1-3 为算术运算符的 i 值;表 1-4 为关系运算符的 i 值。关键字表指针 l 关键字0 BEGIN1 DO2 ELSE3 EN4 IF5 THEN6 VAR7 WHILE表 1-1分界符表指针 l 分界符0 ,1 ;2 。3 :=4 (5 )6 :7 表 1-2算术运算符指针 l 算术运算符10H +11H -20H *21H /表 1-3关系运算符指针 l 关系运算符00H 04H =05H 表 1-4常数表和标识符表是在编译过程中建立起来的。其 i 值是根

6、据它们在源程序中出现的顺序确定的。另外可以根据 Pascal 语言子集中出现其它单词情况进行自行修改以上表格。最后编写程序进行词法分析,判断目标在哪个表中并进行显示。3、实验结果1.测试数据数据共分为 3 组,分别如下:第一组数据var i,j,k:integer;begini:=5;j:=6; k:=i+j;write(k=,k);End.第二组数据var i,sum:integer;beginsum:=0;for i:=1 to 10 dobeginsum:=sum+i;end;writeln(sum=,sum);End.第三组数据var weight,price:real;beginwr

7、ite(please input weight: );readln(weight);if weight= A & c = a & c = 0 & c = 9)return true;elsereturn false;void analyse(FILE *fileP)/分析函数对具体情形进行分析int n;char c;string str = ;int count=0;/标识变量int count1=0;/标识变量while(c = fgetc(fileP) != EOF)if(c = | c = n | c = t)continue;else if(isDigit(c) /如果是数字whil

8、e(isDigit(c)/数字后还是数字str += c;/数值连接c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);for(int a=0;a50;a+)/数字没出现在数组中,在数组中加入if(arr1a=str)break;else if(arr1a=)arr1count1=str;count1+;break;for(int b=0;b50;b+)/数字的分析if(arr1b=str)cout str (5, b ) endl;str = ;else if(isLetter(c) /字母开头的while(isDigit(c) | isLetter(c)

9、/字母后还是字母str += c;c = fgetc(fileP);fseek(fileP, -1, SEEK_CUR);if(isKey(str, n)/如果是关键码cout str ( 1 , n ) endl; /关键码分析elsefor(int i=0;i50;i+)/标识符没出现在数组中,在数组中加入if(arri=str)break;else if(arri=)arrcount=str;count+;break;for(int j=0;j50;j+)/标识符分析if(arrj=str)cout str (6, j ) endl;str = ;else /操作符等字符,为表 2,3,

10、4 中的switch(c)./列举出现在表 2,3,4 中的字符进行分析,此处略int main()/主函数FILE *fileP;fileP = fopen(test.txt, r);/读文件cout -词法分析如下- endl;analyse(fileP);/调用函数 analysereturn 0;六、实验者自评总的来说,实验过程还算顺利,遇到的一系列问题都得到比较好的解决,当然分析器还有很大的改进空间,这里只是简单的依照给定的图实现了 PASCAL 子集的词法分析。虽说如此,但是最后能够完成还是感觉是不太容易的。通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如 C 语言)直接编写此法分析程序。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号