收藏 分享(赏)

编译原理课程设计55671.doc

上传人:dzzj200808 文档编号:2309877 上传时间:2018-09-10 格式:DOC 页数:24 大小:191.92KB
下载 相关 举报
编译原理课程设计55671.doc_第1页
第1页 / 共24页
编译原理课程设计55671.doc_第2页
第2页 / 共24页
编译原理课程设计55671.doc_第3页
第3页 / 共24页
编译原理课程设计55671.doc_第4页
第4页 / 共24页
编译原理课程设计55671.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、福建农林大学东方学院课 程 设 计 报 告题 目 词法分析设计与实现 学 院 东方学院 专 业 名 称 计 算 机 科 学 与 技 术 姓 名 陈 励 楠 学号 081914055 姓 名 叶 俊 香 学号 081914060 姓 名 许 巧 辉 学号 081914056 姓 名 蔡 尚 剑 学号 081914062 姓 名 陈 圣 毅 学号 081914057 姓 名 范 尚 希 学号 081914063 姓 名 黄 凯 学号 081905139 姓 名 陈 育 腾 学号 081914064 姓 名 黄 宝 红 学号 081914059 姓 名 张 传 富 学号 081914065 导 师

2、姓 名 李冬芬 2010 年 12 月福建农林大学东方学院计算机系课程设计报告 1第 1 页 共 23 页目录一、实验目的 2二、实验内容 2三、实验要求 2四、实验环境 2五、实验步骤 3六、实验流程 31、基本测试数据 32、词法分析主程序分析图 3-43、根据以上的正规式编制的正规文法 4-74、词法分析器的状态转换图 7-85、程序源代码 9-206、运行结果 20-21七、实验心得 21八、参考文献 21九、思考题 21-23福建农林大学东方学院计算机系课程设计报告 2第 2 页 共 23 页词法分析设计与实现 一、 实验目的通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的

3、源程序进行扫描的过程中,学会应用单词分析的方法,加深对词法分析原理的理解。二、实验内容编制一个能够分析三种数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1、根据以下的正规式,编制正规文法,画出状态图;标识符 (|) *十进制数(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* (|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制数0x(0|1

4、|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* (|.)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符 + - * / 0x3f 00 while正确结果:这些单词的单词种别及其属性INT10 0INT10 92+ _IDN data _INT16 63INT8 0WHILE _2、词法分析主程序分析图福建农林大学东方学院计算机系课程设计报告 4第 4 页 共 23 页N初始化主函数:输入方程调用 scan()函数

5、,识别单词符号主函数:输出程序结束输入串结束?图 1 程序分析图3、根据以上的正规式编制的正规文法如下对于十进制数:A1B1C1B1D1B1| C1E1B1E1 |.D10|1|2|3|4|5|6|7|8|9对于八进制数:程序开始福建农林大学东方学院计算机系课程设计报告 5第 5 页 共 23 页A20B2B2C2D2 C2E2F2E21|2|3|4|5|6|7F2GF|D2H2F2H2 |.D21|2|3|4|5|6|7G20|1|2|3|4|5|6|7对于十六进制:A30xB3B3C3D3C3E3C3|E3 0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|fD3F3C3F3 |

6、.对于运算符和分隔符: A4+|-|*|/|B5C5B5D5E5D5a|b|y|z福建农林大学东方学院计算机系课程设计报告 6第 6 页 共 23 页E5F5E5|F5a|b|y|z|0|1|2|3|4|5|6|7|8|9C5G5E5G5 |.综上正规文法为:SA1|A2|A3|A4|A5A1B1C1B1D1B1|C1E1B1E1 |.D10|1|2|3|4|5|6|7|8|9A20B2B2C2D2C2E2F2E21|2|3|4|5|6|7F2GF|D2H2F2H2 |.D21|2|3|4|5|6|7G20|1|2|3|4|5|6|7福建农林大学东方学院计算机系课程设计报告 7第 7 页 共

7、23 页A30xB3B3C3D3C3E3C3|E3 0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|fD3F3C3F3 |.A4+|-|*|/|B5C5B5D5E5D5a|b|y|zE5F5E5|F5a|b|y|z|0|1|2|3|4|5|6|7|8|9C5G5E5G5 |.4、词法分析器的状态转换图福建农林大学东方学院计算机系课程设计报告 8第 8 页 共 23 页070 。 *0.9/az/AZ1909其他开始空白a.z/ AZ0 23 469其他。09非数字。07非 o7 且非。110007非 o7。75812 111319/a.f/ AF14非 1.9 且非 a.f 且非A

8、.F150.9/a.f/A.F16非 0.9 且非 a.f 且非A.F。17。018190+/-/ /;If/while/then/dox/X福建农林大学东方学院计算机系课程设计报告 9第 9 页 共 23 页图 2 状态转换图5、程序源代码#include“stdio.h“#include“string.h“union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union

9、chars pro;int scan(char *a); /对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_long); /将分析后的每个 token 输出void save(char *a,int id,int x); /将分析后的结果保存到一个结构数组中char nowChar15; /临时的存储单元,用来存储被空格打断以后单元char kinds118=“ “,“INT10“,“INT8“,“INT16“,“IDN“,“ “,“ “,“ “,“REAL10“,“REAL8“,“REAL16“;/单词的不同种别

10、struct data link100; /用来存放词法分析以后的结果的结构数组int link_long=0; /全局变量福建农林大学东方学院计算机系课程设计报告 10第 10 页 共 23 页int scan(char *a)int id;int a_long=0;int doc=0;while(*a!=NULL)nowChar0=0;a_long=0;doc=0; /对数值的判断及处理if(0:case(:case):case=:case;:nowChara_long=0;Prints(nowChar,5,a_long); /将其具体的类型属性定义为 5continue;default:

11、break;/判断输入的第一个字符是否为字母if(a=5)if(id=8)/id=8,9,10/若为浮点型的数值,则将浮点型的 y 值(转换后的)存入其属性当中且存入单词的种别for(i=0;i=0i-)y=(y+(ai-48)/10;y=y+x; /整数部分与小数部分换算后相加printf(“REAL10t%fn“,y);save(a,id,x,y); /存入结构数组return;福建农林大学东方学院计算机系课程设计报告 20第 20 页 共 23 页if(id=9) /若为八进制浮点型for(i=1;i=0i-)y=(y+(ai-48)/8;y=y+x; /整数部分与小数部分换算后相加pr

12、intf(“REAL8t%fn“,y);save(a,id,x,y); /存入结构数组return;if(id=10) /若为十六进制浮点型for(i=2;i=0i-)y=(y+(ai-48)/16;y=y+x; /整数部分与小数部分换算后相加printf(“REAL16t%fn“,y); /存入结构数组save(a,id,x,y);return;printf(“Wrong Enter“); /所得的具体类型值为 7,则输入有错误return ;6、运行结果福建农林大学东方学院计算机系课程设计报告 21第 21 页 共 23 页七、实验心得通过一系列的实验,使我们对词法分析的阶段有了实践性的认

13、识,在试验过程中,通过对编译原理的学习,对试验代码的分析和运行过程的分析,举一反三,进一步巩固我们的理论基础,重新了解了 C+的相关内容,也让我们深深感受到“一分耕耘,一分收获” 。在此次设计中,我们小组分工明确,虽然每个人的能力不一样,但我们努力做到相互沟通相互帮忙,共同探讨实验中碰到的问题,提高我们的团队意识和增强学习动力。从开始输入的源代码,到后面的反复调试,我们都花了大量的精力,但我们都收获了不少。相信通过此次的实验将使我们更好的掌握编译原理这门理论性和实践性都很强的计算机科学基本学科。八、 参考文献1陈火旺等.程序设计语言编译原理M. 国防出版社. 20012何炎祥.程序构造M.武汉

14、大学出版社.19883郭浩志. PASCAL 语言结构程序设计M.国防科技大学出版社.1989九、思考题1、词法分析能否采用空格来区分单词? 我觉得不可以这么绝对。某些语言的词法分析可以用空格作为分隔符来区分单词(如英文、俄文等拼音文字语言) ,而中文不是拼音文字,一句话的词汇都是连着写的,就不可以用空客区分单词。程序的词法和语言的词法更不同,福建农林大学东方学院计算机系课程设计报告 22第 22 页 共 23 页而且存在着许多情况。有些单词之间一定要用空格等空白符分开,如关键字、标识符和常数之间没有确定的运算符或界符做间隔时,就一定要用空格等空白符分开;但反之,则可以不用空格等空白符做间隔,

15、这时的空白符完全没有意义。所以虽然把不同种类的符号用若干空格分开写没有错,但这只是词法分析中的一个功能(即可以虑过空格、回车等符号继续分析) ,但并不意味着两个不同种别的符号一定要用空格分开才对。如我们都有用 C 编程的经验:比如赋值语句:x=y+z;x是 ID 种类的, =是运算符 ASG,它们是两个单词,且如上书写时编译词法没有错误,词法分析器能够按照文法规则辨别出x与=是两个单词;如果词法分析按空格区分单词,那么若编程人员没有在每两个单词间添加空格的话,词法分析器就会认为x=y+z;整个是一个单词,这样就完全错误了。我想如果词法分析以空格来“初选”单词,然后在一个个初步分割的部分中再按照

16、词法文法规则进行词法分析也是可以的,但对于某些编程语言(如 C)来讲有些没有必要。 如果某种编程语言一定要以空格来区分单词进行词法分析,那也没错,因为可能会有些语言把空白符用作单词符号间的界符。 我想至少对于 C 语言, 词法分析是不能绝对采用空格来区分单词的。2、程序设计中哪些环节影响词法分析的效率?如何提高效率? 我认为在程序设计中影响词法分析效率的主要是关键字的识别过程。因为当词法分析器识别出一个标识符时,就去和保留字表中的关键字进行比较,以确定它是否是关键字。如果关键字和标识符比较少,标识符在表中采取顺序比较的时间还可以接受,但如果关键字和标识符都比较多,那么查询比较的平均时间就会比较

17、长,就会影响到词法分析的效率。且每一次比较都是字符串之间的比较,也很耽误时间。 对于关键字的比较,有几个方面可以提高效率: 1)是保留表的安排方法可以更科学,如按照哈希链表方式存放关键字,数组的不同单元链接着不同字母开头的关键字,但同一链表中的关键字都是同一字都是同一字母开头的。比如 sizeof,switch,struct 等都在同一链表中,头指针在数组的第 f(s)单元中(注: f(s)是s的某一函数值) 。然后当前标识符来临,先判断其开头字母的函数值与那个单元相配,再在相应关键字链表中进行比较,福建农林大学东方学院计算机系课程设计报告 23第 23 页 共 23 页这样效率会提高一些。 2)采取比较好的预选方式,如对标识符先进行筛选,有些不可能是关键字的标识符就可以不再与保留字表中的关键字进行比较了。如某种语言的关键字最长为8 个字符,那么对于长度大过 8 的标识符被“筛下”了。当然进行“筛选” ,也要付出一定的代价。 3)字符串的比较方法是很关键,可以采取高效的比较方法,使得先排除不可能。除了关键字的识别,词法分析的其他环节,如好的预处理阶段也可以提高词法分析效率。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报