您好,欢迎访问三七文档
塔里木大学-信息工程学院编译原理实验-1-编译原理结课论文题目:词法分析作者:李健豪电话:15299585826Email:教师:肖少拥、吴刚递交日期:2013年11月28日塔里木大学-信息工程学院编译原理实验-2-目录1.实验的目的与任务:.............................................................................31.1涉及知识点:................................................................................31.2涉及技能点:................................................................................42题目分析...................................................................................................43.支持的语句及运算:.............................................................................54.基本树形结构:.....................................................................................6整体框架................................................................................................75.分析程序代码:.....................................................................................85.1部分代码分析................................................................................85.2功能实现:..................................................................................106程序测试.................................................................................................127.思考总结................................................................................................138.参考文献................................................................................................139.学习编译原理后的感想.......................................................................14塔里木大学-信息工程学院编译原理实验-3-1.实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。编译原理是一门理论性和实践性都比较强的课程。进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。同时培养学生实际动手能力。词法分析的目的是将输入的源程序进行划分,给出基本符号的序列,并掠过注解和空格等分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。语法分析是编译过程的核心部分。语法分析的基本任务是在词法分析识别出单词符号串的基础上,分析判断程序的语法结构是否符合语法规则。语言的语法结构用上下文无关文法来描述,因此,语法分析器的任务本质上是按上下文无关文法的产生式,确定整个单词串是否构成语法上正确的程序。语法分析的方法通常分为两类:自上而下分析法和自下而上分析法这次是编制一个读标识符过程,从输入的源程序中,识别出各个具有独立意义的,即标识符基本保留字母、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续进行)1.1涉及知识点:词法分析(英语:lexicalanalysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexicalanalyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用Lex等工具自动生成。词法分析器(词法分析程序):从源代码中读取输入字符,产生单词序列(生成独立的有意义的逻辑单元称作单词(token)),提交给语法分析使用。任务:逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。塔里木大学-信息工程学院编译原理实验-4-识别出源程序中的单词;删除无用的空白字符及注释(空格、回车等),这些信息仅增加了源程序的可读性,便于程序员阅读和维护程序,而对于语法分析是完全无用的。进行词法检查,能够检测出输入中不能形成源语言任何单词的错误字符串。1.2涉及技能点:正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。正则表达式(regularexpression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“ab+”描述的特征是“一个'a'和任意个'b'”,那么'ab','abb','abbbbbbbbbb'都符合这个特征。正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的2题目分析1.这里采用C语言编写的源程序作为词法分析程序的输入数据,输入数据和分析结果将在文本框中显示。词法分析器的源代码使用C++语言编写。2.下面就词法分析程序中的主要变量进行说明:主函数main():打开要分析的C语言源程序,若不能正确打开,则报错。塔里木大学-信息工程学院编译原理实验-5-1、数字检测,对照符号表输出,若匹配成功,则返回序号;2、字符串检测,对照符号表输出,若匹配成功,则返回序号;3、基本保留字检测,对照符号表输出,若匹配成功,则返回序号;4、运算符检测,对照符号表输出,若匹配成功,则返回序号;5、分隔符(界符)检测,对照符号表输出,若匹配成功,则返回序号;6、排错处理;结束。3.以下给定一个C语言的符号表的设计和结构:3.支持的语句及运算:1)数据类型:int,charvoid2)语句:赋值(=),if,while,for,begin,then3)数学运算:+,-,*,/4)关系运算:=,!=,,,=5)分隔符::,;{}[]()6)支持函数的定义、调用7)支持复合语句塔里木大学-信息工程学院编译原理实验-6-4.基本树形结构:if语句:while语句:复合语句:if语句表达式语句语句while语句表达式语句语句复合语句语句语句声明塔里木大学-信息工程学院编译原理实验-7-整体框架输入文字开始词法分析语法分析建立符号表类型检查代码生成结束语法树符号表判断是否是字母判断是否是数字检索关键字表格塔里木大学-信息工程学院编译原理实验-8-5.分析程序代码:5.1部分代码分析#includestdio.h#includestdlib.h#includestring.h#define_KEY_WORD_ENDwaitingfouyourexpanding/*定义关键字的结束标志*/typedefstruct{inttypenum;/*种别码*/种别码:表示单词的类别,提供给语法分析使用。一般用整数表示,比如标识符的种别码为1,常数为2,保留字为3,运算符为4,界符为5。char*word;}WORD;charinput[255];/*源程序缓字符冲区*/创建一个数组用来记录源程序缓字符冲区,数组中包含的个数为256。chartoken[255]=;/*单词缓冲区*/创建一个数组用来记录单词缓冲区,数组中包含的个数为256。Iintp_input;/*源程序字符指针*/定义一个字符指针,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。intp_token;/*单词缓冲区指针*/定义一个单词缓冲区指针,这里解释一下数组指针和指针数组的区别:数组指针--指向数组的指针,是一个指针,其指向的类型是数组;指针数组--元素为指针的数组,是一个数组,其中的元素为指针。塔里木大学-信息工程学院编译原理实验-9-charch;char*rwtab[]={begin,if,then,while,do,end,int,return,char,_KEY_WORD_END};WORD*scaner();/*词法扫描函数,获得一个单词*/词法扫描函数,根据建立的语法树和符号表筛选单词voidmain(){intover=1;intcount=0;WORD*oneword=newWORD;printf(**********请输入,以#号结束*************:\n);scanf(%[^#]s,input);/*输入源程序字符串到缓冲区,以#结束*/p_input=0;printf(词法分析结果是:\n\n);while(over1000&&over!=-1){oneword=scaner();if(oneword-word==OVER)break;elseif(oneword-typenum1000)printf((%d,%s),oneword-typenum,oneword-word);over=oneword-typenum;coun
本文标题:编译原理-结课论文
链接地址:https://www.777doc.com/doc-4455499 .html