编译原理实验报告 词法分析

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

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

1、编译原理实验一词法分析一、 实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。二、 实验内容及要求对某特定语言 A ,构造其词法规则。该语言的单词符号包括:保留字(见左下表)、标识符(字母大小写不敏感) 、 整型常数、界符及运算符(见右下表) 。 功能要求如下所示:按单词符号出现的顺序,返回二元组序列,并输出。出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。如果出现词法错误,报出:错误类型,位置(行,列) 。处理段注释(/* *

2、/) ,行注释(/) 。有段注释时仍可以正确指出词法错误位置(行,列) 。三、 实验过程1、 词法形式化描述使用正则文法进行描述,则可以得到如下的正规式:其中 ID 表示标识符,NUM 表示整型常量,RES 表示保留字,DEL 表示界符,OPR 表示运算符。A(ID | NUM | RES | DEL | OPR) *IDletter(letter | didit)*NUMdigit digit*lettera | | z | A | | Zdigit 0 | | 9RES program | begin | end | var | int | and | or | not | if | th

3、en | else | while | doDEL( | ) | . | ; | ,OPR+ | * | := | | = | 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。2、 单词种别定义;A 语言中的单词符号及其对应的种别编码如下表所示:单词符号 种别编码 单词符号 种别编码program 1 + 16begin 2 * 17end 3 ( 18var 4 ) 19int 5 , 20and 6 . 21or 7 := 22not 8 ; 23if 9 24then 10 = 27do 13 29整型常量 15 - 303

4、、 状态转换图;语言 A 的词法分析的状态转换图如下所示:空格符,制表符 或回车符 字母或数字数字0 132字母 非字母或数字+非数字5数字*78411633()10.9,12:138)16=15;2219 1817 =非=23其他- 2427/ 2625 */28其他4、 运行环境介绍;本次实验采用 win-tc 进行代码的编写和编译及运行程序的运行环境为 windows5、 关键算法的流程图及文字解释;程序中用到的函数列表:变量 ch 储存当前最新读进的字符的地址strToken 存放当前字符串voidmain() /主函数struct binary *lexicalAnalyze();

5、/词法分析的主函数,返回一个二元组的指针void GetBC(); /检查 ch 指向的字符是否为空格、制表或回车符,如果是则调用 GetChar()直至不是上述字符void GetChar(); /ch 前移一个地址单元int ConCat(); /将 ch 指向的字符连接到 strToken 之后int isLetter(); /判断 ch 指向的字符是否字母int isDigit(); /判断 ch 指向的字符是否数字int insertId(); /向标识符表中插入当前 strToken 的字符串int insertConst(); /将 strToken 的常数插入常数表中int R

6、eserved(); /检测当前 strToken 中的字符串是否保留字,若是,则返回编码,否则返回 0int isId(); /检测当前 strToken 中的字符串是否在标识符表中已存在,若是,则返回其编号,否则返回 0int isConst(); /检测当前 strToken 中的字符串是否在常数表中已存在,若是,则返回其编号,否则返回 0void errProc(int errType); /出错处理过程,errType 是错误类型,将错误信息加入错误表中main()函数的流程图如下:25其他开始程序的初始化操作:将文件的内容读入内存;保留字、标识符、常数和错误表初始化;ch 指针初始

7、化lexicalAnalyze()函数的流程图如下所示:到达数据尾部执行LexicalAnalyze()若有错误发生,则跳至下一个单词开始,否则输出二元组否是输出标识符表,常数表和错误表回收内存结束开始到达数据尾部否GetBC()IsLetter() 是isLetter() | isDigit()GetChar()是否Reserved()是否否ConCat()InsertId()isDigit() 是isDigit()GetChar()是ConCat()否InsertConst()是否为运算符或界符否是否是否为注释 注释处理否errProc()生成二元组结束Reserved()、isId()和

8、 isConst()函数均采用了对链表的遍历算法,errProc()函数通过识别不同的错误编号,向错误链表中添加相应的错误信息。6、测试报告(测试用例,测试结果) ;首先输入一个不含错误的程序(两种注释)进行检测:运行后在控制台上得到的结果如下所示:得到的二元组序列如下所示:(只选取了前半部分。 )经检验,输出的是正确的二元组序列。再输入一个含有错误的程序(含有注释)进行检验:运行后在控制台上得到的结果如下所示:经检验,错误的位置与错误类型均是正确的得到的二元组序列如下所示:(只选取了前半部分。 )四、 实验总结通过本次实验,我加深了对词法分析器的理解,对词法分析有了初步的认识,同时也加深了对

9、编译原理的了解。同时,自己的编程能力也得到了进一步的提高,对各种在编码中出现的问题进一步熟悉。词法分析器的主要功能就是分析在程序中出现的单词,主要用到了结构化的编程方法,自上而下进行分析,将大功能根据模块进行分解,最终得到一个个的子功能,分别实现这些子功能就可以完成整个程序的编写,这个过程在本次实验过程中得到了很好的体现,程序通过一个主函数调用一个个元函数来实现。感谢老师的耐心而细致的教学,我感觉对我完成本次实验的帮助很大。附:词法分析源程序(c 语言):#include stdio.h#include conio.h#include string.h#include stdlib.h#inc

10、lude ctype.hstruct identifier /记录标识符的链表节点char name33;int index;struct identifier *next;struct constant /记录常数的链表节点int value;int index;struct constant *next;struct binary /记录二元组的链表节点int type;int property;struct reserved /记录保留字的结构体char name10;int type;struct err /记录错误信息的链表节点int line;int row;char descri

11、be30;struct err *next;char *ch; /指向当前读入字符的指针char strToken33; /记录当前字符串的数组int curChar = 0;int line = 1; /记录行号int row = 1; /记录列号int errors = 0; /记录错误数/初始化保留字表struct reserved rtable13 = program,1,begin,2,end,3,var,4,int,5, and,6,or,7,not,8,if,9,then,10,else,11,while,12,do,13;/标识符链表头结点和尾节点struct identifi

12、er *itable ;struct constant *ctable;/错误表头结点和尾节点struct err *etable;struct identifier *itail;/常熟表头结点和尾节点struct constant *ctail;struct err *etail;struct binary *lexicalAnalyze(); /词法分析的主函数,返回一个二元组的指针void GetBC(); /检查 ch 指向的字符是否为空格、制表或回车符,如果是则调用 GetChar()直至不是上述字符void GetChar(); /ch 前移一个地址单元int ConCat();

13、 /将 ch 指向的字符连接到 strToken 之后int isLetter(); /判断 ch 指向的字符是否字母int isDigit(); /判断 ch 指向的字符是否数字int insertId(); /向标识符表中插入当前 strToken 的字符串int insertConst(); /将 strToken 的常数插入常数表中int Reserved(); /检测当前 strToken 中的字符串是否保留字,若是,则返回编码,否则返回 0int isId(); /检测当前 strToken 中的字符串是否在标识符表中已存在,若是,则返回其编号,否则返回 0int isConst(

14、); /检测当前 strToken 中的字符串是否在常数表中已存在,若是,则返回其编号,否则返回 0void errProc(int errType); /出错处理过程,errType 是错误类型,将错误信息加入错误表中main(int argc,char * argv) /主函数/程序初始化操作int nLen;char *pchBuf;struct binary *curBinary;FILE *pf = fopen(argv1,r);FILE *pf1 = fopen(argv2,w);itable = (struct identifier*)malloc(sizeof(struct identifier);ctable = (struct constant*)malloc(sizeof(struct constant);etable = (struct err*)malloc(sizeof(struct err);itable-index = 0;ctable-index = 0;itail = itable;ctail = ctable;etail = etable;itable-next

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

最新文档


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

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