编译原理-大作业

上传人:F****n 文档编号:99618287 上传时间:2019-09-20 格式:DOC 页数:17 大小:540.50KB
返回 下载 相关 举报
编译原理-大作业_第1页
第1页 / 共17页
编译原理-大作业_第2页
第2页 / 共17页
编译原理-大作业_第3页
第3页 / 共17页
编译原理-大作业_第4页
第4页 / 共17页
编译原理-大作业_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《编译原理-大作业》由会员分享,可在线阅读,更多相关《编译原理-大作业(17页珍藏版)》请在金锄头文库上搜索。

1、信息工程学院 编译原理课程论文 塔里木大学信息工程学院课程论文基于 c 语言的简单词法分析器的设计课程名称 编译原理 所属学院 信息工程学院 班 级 计算机16-6 学生姓名 李鹏宇 学 号 二零一四年十二月电视墙也就是电视背景装饰墙,是居室装饰特别是大户型居室的重点之一,在装修中占据相当重要的地位,电视墙通常是为了弥补客厅中电视机背景墙面的空旷,同时起到修饰客厅的作用。因为电视墙是家人目光注视最多的地方,长年累月地看也会让人厌烦,所以其装修就尤为讲究目 录一、引言1二、基于c 语言词法分析器的设计12.1词法分析器的设计原则12.2词法分析器的设计对象22.3词法分析器的任务及功能22.3.

2、1词法分析器的任务22.3.2 词法分析程序的功能:22.4各种单词符号对应的种别码:2三、基于c 语言词法分析器的实现33.1词法分析程序的算法思想:33.2主程序示意图:33.3函数定义说明43.4程序设计实现及功能说明43.4.1关键字的定义43.4.2符合的关键字的查找4四、词法分析程序的C语言程序源代码5五、结果分析:10六、结束语11参考文献12摘要:词法分析器构造技术起源于编译器前端的词法分析需求,是编译的第一阶段。其主要任务是读入输入字符,产生记号序列,并提交给语法分析使用。词法分析器技术也经常应用于其他领域,如查询语言与信息检索系统。在每个应用中,最基本的问题是如何设计与说明

3、一种特殊的程序,它能够完成由字符串的模式触发的动作。本文通过实际构造FineC语言(作者设计的一个C语言的轻量子集)的词法分析器对词法分析器的构造原理做了基于实践的探讨。关键字:词法分析器,双缓冲区,符号表,正则表达式,状态转换图一、引言词法分析顾名思义,就是分词。它是用程序设计语言编制出的源程序作为输入,以单词的序列作为输出。分词的过程可以通过编制程序让其自动完成,我们通常把这个分词程序称为词法分析器。词法分析器分析的源程序可以是现有的各类程序设计语言源程序也可以是人为给定的模型语言的源程序。它一般有五个阶段:词法分析,语法分析,语义分析和中间代码产生及优化,目标的代码生成。完成计算机翻译过

4、程的重要阶段,它为以后的语义分析、语法分析打好基础, 做好准备,以便高效的、高质量的生成目标语言的程序。所以词法分析,是编译过程的基础。二、基于 c 语言词法分析器的设计2.1词法分析器的设计原则在编译程序的词法分析,语法分析,语义分析和中间代码的产生及优化阶段中,每个阶段都要遵守功能相等的原则。一个语言的语法的形成是词法规则和语法分析依据的语法规则组成的,衡量一个语法是不是合法要从“形”的角度去出发。因此在词法分析的阶段,重要的研究对象也就变成了词法规则。词法分析程序的输入数据是词法分析器处理的对象,其实是源程序经过了编译预处理,去掉多余的符号后,形成的代码,这样给词法分析较为方便。词法分析

5、的过程是线性的从头到尾扫描一遍,复杂程度较低,易实现。2.2词法分析器的任务及功能 2.2.1词法分析器的任务从左到右所有字符逐个的对源程序进行扫描,产生一个一个单词的符号,字符串的源程序转换成单词符号串中的中间程序。组成语言的基本元素是词法分析程序输出的结果,也就是单词,在实际的处理过程中,输出不一定是单词,而是每个单词相对应的二元式,形为。编码的方式由编译系统的开发者决定。故经过词法分析,在输出结果中并没有单词本身。 2.2.2 词法分析程序的功能:输入:所给文法的原程序字符串。输出:二元组(syn,token 或 sum )构成的序列。其中:Syn:“单词种别码”; Token:“存放的

6、单词自身字符串”; Sum:“整型常数”。例如:对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)2.3各种单词符号对应的种别码:表2.3 各种单词符号对应的种别码单词符号种别码 单词符号种别码+13;2614(27*15)28/16#0dight dight*11=25bgin1:17If2:=18Then320wile421do523lettet(letter|digit)*10=24三、基于c 语言词法分析器的实现基于c语言的词法分析

7、器,是它本身程序由 c 语言编写而且它识别的源程序单词串是用 c 语言编写的。本程序编写环境是 Touboc 2.0 ,在 TC 默认途径下编辑一个 c 语言源程序再调用本程序,取名eample.c 方便程序的调用和分析,输出结果是二元式码。3.1词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.2主程序示意图:主程序示意图如图3-1,3-2所示。其中初始包括以下两个方面:图3-1主程序示意图 关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),

8、当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;图3-2主程序示意图3.3函数定义解释(1) fopen() 在默认路径下打开分析程序并读入字符串。(2) otherprocess() 识别当前是其它(标点符号等)。(3) alphaprocess() 识别当前是数组、保留字、标识符。(4) search() 查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和

9、记录次序码。(5) digitprocess() 识别当前是常整数、小数、负小数。(6) point() 识别当前字符串是指针。3.4程序设计实现及功能说明3.4.1关键字的定义void init() for( int j=0; j18; j+) strcpy(symtablej.lexptr,strj); symtablej.token=j+3; 3.4.2符合的关键字的查找int search(char *temp)for(unsigned int i=0;i 18;i+) if(!strcmp(symtablei.lexptr ,temp)return symtablei.token;

10、return 0; 四、结果分析:运行结果如图4-1所示图4-1初始界面输入end+good/1+2*1=23;need # 后经词法分析输出如下序列:(end 6)(+ 13)(good 10)(/ 16)(1 11)(+ 13) 如图5-2所示:图4-2 运行结果图五、结束语词法分析是编译器设计的第一个阶段。相对于后面的步骤来说,词法分析器的设计相对简单,但其原理可以指导很多现实中的应用。词法分析器是此次编译原理课程的最后一个任务,虽然对书上的理论知识已经事先温习并稳固了,但在刚开始的实践中,对如何进行设计还是很模糊。之后我通过参考一些课外资料,与同学一起探讨学习,明确了词法分析器设计的大

11、概思路后,顺利完成任务。通过此次的编译原理课程论文,不仅让我了解了什么是词法分析器以及它的一些具体功能,也让我通过查阅各种资料以及询问指导老师了解到如何设计、编制并调试词法分析程序,经过反复几次对程序的修改和调试,是我从中学习到了很多以前不知道的新知识,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言直接编写此法分析程序,使我对编译原理的知识掌握得更扎实、稳固,不再只停留在只会做题却对知识的掌握的一知半解,现在真正将书面知识运用到实际的设计中。另外,也让我重新熟悉了VC6.0的相关内容,加深了对VC6.0语言的用途的理解。通过这次的实践,相信有了这次课程论

12、文的经验,会对我下一个程序的课程论文会有很大的帮助。参考文献1胡元义.编译原理教程M.西安电子科技大学出版社.2003年3月2刘磊,金英等.编译程序的设计与实现M.高等教育出版社.2004 年7 月3Kenneth C. Louden著.冯博琴译.编译原理及实践.机械工业出版社.2000年4Andrew W.Appel著.赵克佳等译.现代编译原理C语言描述.人民邮电出版社.2006年5陈火旺,刘春林等.程序设计语言编译原理第三版.国防科大出版社.2001年附录:词法分析程序的C语言程序源代码:#include #include char prog80,token8,ch;int syn,p,m

13、,n,sum;char *rwtab6=begin,if,then,while,do,end; scaner();main()p=0; printf(n please input a string(end with #):/n); do scanf(%c,&ch); progp+=ch; while(ch!=#); p=0; do scaner(); switch(syn) case 11:printf( %-10d%5d )n,sum,syn); break; case -1:printf(you have input a wrong stringn); getch(); exit(0); default: printf( %-10s%5d )n,token,syn); break; while(syn!=0); getch(); scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; ch=progp+; m=0; while(ch= )|(ch=n)ch=progp+; if(ch=a)|(ch=A) while(ch=z)&(c

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

最新文档


当前位置:首页 > 办公文档 > 教学/培训

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