资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
词法分析器的设计与实现词法分析器的设计与实现 专业名称:2007 级计算机科学与技术(师范) 实验室:2 号实验楼 201 多媒体教室 实验课程:编译原理实践 实验名称:词法分析器的设计与实现 姓名:吴德云 学号:0715083 同组人员:程郑飞,董兆钧,郭芳华,韩健,韦振 实验日期:2009.10.20-2009.11.20 实验目的与要求实验目的与要求: 1、了解字符串编码组成的词的内涵,感觉一下字符串编码的方法和解读。 2、 了解和掌握自动机理论和正规式理论在词法分析程序和控制理论中的应 用。 实验内容实验内容: 词法分析器设计词法分析的任务是: 从左至右逐个字符地对源程序进行扫描 产生一个个的单词符号,把作为字符串的源程序转换成为单词符号串的中间程 序。因此词法分析是编译的基础。 由于我们规定的程序语句中涉及单词较少, 故在词法分析阶段忽略了单词输 入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能 是输入源程序,输出单词符号。本实验的词法分析的流程图如下图1所示,规定 输出的单词符号格式为如下的二元式: (单词种别,单词自身的值) 其中变量、常量的单词自身的值可以是变量、常量等在符号表的地址码。 11 词的内部定义 对常量、变量、临时变量、保留关键字(begin,end,else,do等)、关系运 算符、逻辑运算符、分号等,规定其内部定义如附表所示。 12 功能说明 本程序实现的功能有: (1) 滤空格:空格在词法分析时一种不可缺少的界符,但对计算机来讲是 无用的,所以需要滤掉。 (2) 识别保留字:在内存中设有一张保留字表。对每个字母打头的字母, 数字字符串要查此表。若查到则为保留字,并将其对应的类别输出。 如查不到,则认为是用户自定义的标示符。 (3) 识别其他的类别的字符:如界符,运算符。 (4) 识别非法字符(串):若以上三种情况都不能识别则认为是非法字符 (串)。 次词法分析器函数的功能在屏幕上输出词法分析的结果(即二元式序列程 序)。 图图 1 1 词法分析器的流程图词法分析器的流程图 下面给出部分词法分析状态转换图: 图图 2 2 识别标示符的转换图识别标示符的转换图 如上图 2 从初态 1 开始,如输入的符号是字母,则读进它,并转换到 2,在 状态 2 下若读进的是字母或数字则再度进它, 并重新进入状态 2; 重复这个过程, 直到在状态 2 下发现读进的符号不再是字母或数字时,认为该字符已经被读出 2 进入 3 状态。3 是终态,表明已识别出一个标示符。 图图 3 3 识别整数的状态转换图识别整数的状态转换图 如上图 3 从初态 1 开始,如输入的符号是数字,则读进它,并转换到 2,在 状态 2 下若读进的是数字则再度进它,并重新进入状态 2;重复这个过程,直到 在状态2下发现读进的符号不再是数字时, 认为该整数已经被读出2进入3状态。 3 是终态,表明已识别出一个整数。 以上需要注意的是当一个标示符被读出时,已经多读了一个字符,此方法就 是超前进位搜索的思想。在识别=,关系运算符时也用到此思想,具体见 程序,就不复述了。此处就只画的识别,见图 4。 图图 4 4 识别识别的状态转换图的状态转换图 此处其它指除了,=以外的输入符号。 附表附表 词的内部定义表词的内部定义表 单词符号 种别码 自身值 begin 1 do 2 else 3 end 4 if 5 then 6 var 7 while 8 print 9 = = 10 27 11 = 26 27 #include using namespace std; #define MAX 9 char ch = ; string Variable25=“0“;/定义了用以标示已经标示的变量 string Constent25=“0“;/定义了用以标示已经标示的常量 string key9=“begin“,“do“,“else“,“end“,“if“,“then“,“var“,“while“,“print“; int Isvar(string c)/查表,看已经识别的变量在变量表的地址 int i; for(i=0;i=a)|(c=A) return 1; else return 0; int IsDigit(char c) /判断是否为数字 if(c=0 if(ch=) cout) coutin_fn; if(fpin=fopen(in_fn,“r“)!=NULL) break; else cout“文件路径错误!请输入源文件名:“; cout“n*词法分析结果如下 *“endl; analyse(fpin); fclose(fpin); 实验测试实验测试 测试数据以文件形式给出,名为 abc.txt。内容如下: var i,j begin i:=1; j:=5; while (i=j) do i:=I*2+j; end 输出结果如下: 实验实验感想感想 以上程序只列出了一种语言的部分单词符号,可以对其进行扩充并运行,识 别出一个个的单词符号。 (单词种别,单词自身的值)其中变量、常量的单词自身的值可以是变量、常 量等在符号表的地址码。这就话上课没有好好听懂,导致我们的输出与此法分析 器的任务是相违背的。开始的输出是(单词种别,单词自身)如 22 i的形式。是 错误的,今经组员讨论发现的。 在实验中还遇到的困难很多, 如文件打不开, 每次输入文件名后就是打不开, 最后上网查才知道原来是在新建文件时不需要后缀名但是打开时却需要。 就只一 点就浪费了大概一个下午的时间!还有就是组内讨论时分歧很多。不过通过此次 试验还是学到了很多,特别是程序调试。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号