




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 词法分析 (Lexical Analysis),Lexical: of or relating to words or the vocabulary of a language as distinguished from its grammar and construction,词法分析在编译程序中的逻辑位置,表 处 理,错 误 处 理,目 标 代 码 生 成,中 间 代 码 优 化,中 间 代 码 生 成,语 义 分 析,语 法 分 析,词 法 分 析,目 标 程 序,源 程 序,主要内容: 词法分析程序的功能; 单词分类及内部表示; 词法分析程序的设计与实现步骤。,3.1 词法分析介绍,例 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,源程序一般表现为字符序列的形式;,例 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,期望的源程序表示形式,:=,:,END,3.1.1 词法分析程序的功能 单词是字符的序列,是指语言中那些具有独立含义的最小语义单位。 单词不是程序设计语言中的语法概念,是编译程序中引进的一个概念。 编译程序的翻译工作 为提高效率,编译应该在单词一级上进行;,词法分析的主要任务:词法分析是编译的第一阶段,它的的主要任务是按语言的词法规则,从左至右逐个字符地对原程序进行扫描,从源程序中识别出每个单词,并把每个单词转换成它们的内部表示,即所谓的TOKEN,同时进行词法检查。 词法分析程序:执行词法分析的程序称为词法分析程序,有时也称为词法分析器(Lexical Analyzer)或者扫描器(Scanner)。,3.1.2 词法分析程序的接口,词法分析程序与语法分析程序的接口有两种形式: 词法分析程序作为编译器的独立一遍 遍(Pass):所谓“遍”就是对源程序或源程序的中间表示形式从头到尾扫描一次,并作加工处理,生成新的中间结果或目标程序。 词法分析程序作为独立的一遍:读入源程序字符序列,识别出每一个单词并将其转换成相应的内部表示,形成一个TOKEN序列,这个TOKEN序列将作为语法分析程序的输入;,词法分析程序作为语法分析程序的一个子程序 语法分析程序每调用一次词法分析程序,词法分析程序就从源程序的字符序列中拼出一个单词,并将其TOKEN值返回给语法分析程序。 这种方式的好处是,它不需要存储源程序的内部表示。,词法分析器的接口,3.2 词法分析程序的设计 3.2.1 单词分类,一般常用程序设计语言的单词可以分为以下几类: 保留字:保留字一般是由语言系统自身定义的,通常是由字母组成的字符串。如C语言中的int, if, for, do等等。这些字在语言中具有固定的意义,是编译程序识别各类语法成分的依据。 标识符:用来标识程序中各个对象的名称。它们由用户定义,用来表示变量名、常量名、数组名和函数名等。,常量:主要包括整数常数、实数常数、字符常量、字符串常量等。 特殊符号:包括运算符和界限符。 运算符表示程序中算术运算、逻辑运算、 字符运算、赋值运算的确定的字符或字符串。 如各类语言通用的+、-、*、/、=、=等。 界限符在语言中是作为语法上的分界符号使用的。 如逗号、分号、单引号等。,3.2.1 单词分类(续),3.2.2 单词的内部表示,TOKEN结构图 单词的内部表示TOKEN的结构一般由两部分组成:单词类别和语义信息。 单词类别,又称词法信息,用来区分单词的不同种类,通常可以用整数编码来表示。 单词的语义信息,应该是唯一确定其本身内容的编码。,一、标识符和常量的TOKEN结构,给出标识符和常量类别编码; 给出标识符和常量的语义信息。 关于语义信息可以有两种处理方法: 一种是在其TOKEN的语义信息部分直接存储这些值; 另外一种是设置标识符表和常量表来存储其值,这时TOKEN的语义信息部分就是一个指向相应表项的一个指针。 第一种方法处理起来比较简单,但是TOKEN的空间大小不好确定,可能造成空间浪费。因此,我们采取第二种策略。,二、保留字、界限符和运算符的处理,可以有两种处理方法: 一种是保留字、界限符和运算符分别算作一类,除了要给出其类别外,还需在其TOKEN的语义信息部分直接存储这些值的串或整数编码;如: 另外一种是保留字、界限符和运算符采用一符一类的方法,不输出单词的值(其TOKEN的语义信息部分为空),只输出其类别码即可。如:,例1 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,不设置标识符表和常量表,词法分析程序扫描该程序段的字符序列,生成下列TOKEN序列: 1.( 15, ) 2. ( 1, sum ) 3. ( 30, ) 4. ( 1, first ) 5. ( 30, ) 6. ( 1, count ) 7. ( 35, ) 8. ( 20, ) 9. ( 31, ) 10. (37, ) 11. ( 23, ) 12. (37, ) 13. ( 1, sum ) 14. ( 32, ) 15. ( 1, first ) 16. ( 33, ) 17. ( 1, count ) 18. ( 36, ) 19. ( 2, 10 ) 20. (37, ) 21 . ( 24, ) 22. ( 34, ),例1 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,不设置标识符表和常量表,词法分析程序扫描该程序段的字符序列,生成下列TOKEN序列: 1.($var, ) 2. ($id, sum ) 3. ($comma, ) 4. ($id, first ) 5. ($comma, ) 6. ($id, count ) 7. ($colon, ) 8. ($real, ) 9. ($semi, ) 10. ($return, ) 11. ($begin, ) 12. ($return, ) 13. ($id, sum ) 14. ($assi, ) 15. ($id, first ) 16. ($plus, ) 17. ($id, count ) 18. ($mult, ) 19. ($int, 10 ) 20. ($return, ) 21 . ($end, ) 22. ($stop, ),设置标识符表和常量表,词法分析程序扫描该程序段的字符序列,生成下列TOKEN序列: 1.($var, ) 3. ($comma, ) 5. ($comma, ) 7. ($colon, ) 8. ($real, ) 9. ($semi, ) 10. ($return, ) 11. ($begin, ) 12. ($return, ) 13. ($id, p1) 14. ($assi, ) 15. ($id, p2 ) 16. ($plus, ) 17. ($id, p3 ) 18. ($mult, ) 20. ($return, ) 21 . ($end, ) 22. ($stop, ),p2,p1,p3,p4,标识符表,常量表,例1 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,sum,2. ($id, p1 ),first,count,10,4. ($id, p2),6. ($id, p3 ),19. ($int, p4 ),例 某程序片段如下: VAR sum, first, count: real; BEGIN sum:=first + count * 10 END.,曾期望的形式,源程序,词法分析的结果,3.2.3 单词的形式描述,描述程序设计语言中单词的工具主要有:正则表达式、自动机和正则文法。 设计一个语言的词法分析器,通常是首先用正则表达式描述各类单词的组成,然后将其转换为确定有限自动机,最后根据这个自动机来构造词法分析器 。,基于正则表达式的单词的形式化描述 一般的程序设计语言,各类单词的正则表达式可描述如下 : 1)标识符: L( L|D )* 其中:L=a-z, A-Z, D=0-9 2)正整数: D1D* 其中:D1=1-9,D=0-9 3)特殊符号: + | ;| :| := | | = | 4)保留字: begin | end | while| ,基于有限自动机的单词的形式化描述 构造识别单词的有限自动机的方法与步骤如下: 1. 根据构成规则对程序语言的单词按类构造出相应的状态转换图,或将各类单词的正则表达式转换成相应的有限自动机。 2. 合并各类单词的状态转换图,构成一个能识别语言所有单词的DFA。合并方法为: (1)将各类单词的状态转换图的初始状态合并为一个唯一的初始状态; (2)化简调整状态冲突和对冲突状态重新编号; (3)如果有必要,增加出错状态。,例:,标识符,D,1,D,无符号整数,+,界限符,、,运算符,:,=,图,3,.,4,各类单词的自动机,;,:,=,合并后的DFA,3.2.4 自动机的实现,自动机实现的状态转换矩阵法(又称数据中心法 ) 把自动机看作一种数据结构(状态转换矩阵),由控制程序控制字符在其上运行,从而完成词法分析。转换矩阵法的优点是程序短,但占存储空间多。 State:=InitState; Read(CurrentChar); while T(State, CurrentChar)error ,自动机实现的直接转向法 (又称状态转换图方法、程序中心法 、) 每个状态对应一个带标号的switch语句 转向边对应goto语句 特点: 程序长,但占用存储空间少,b,非终止状态对应的switch语句,Li: switch ( CurrentChar ) case a :goto Lj; case b : goto Lk; default : Error( ); ,终止状态对应的switch语句,Li: seitch ( CurrentChar ) case a :goto Lj; case b : goto Lk; case Eof : Accept; default : Error( ); ,3.3 词法分析程序的实现 3.3.1 实现词法分析程序应注意的问题,一般语言中常见的一些问题。 1. 保留字 识别保留字的实现方法可分为两大类:一类是设置保留字表,另一类是用自动机单独来识别。 设置保留字表方法的主要思想是事先构造好所谓的保留字表,在进行词法分析时,把保留字也当作一般标识符来识别,然后查保留字表,若有,则把它作为保留字来处理;若没有,则按一般标识符来处理。,用自动机单独来识别保留字的主要思想是在自动机中加入识别各个保留字的状态,即把保留字和一般标识符分开来识别而不统一识别。,两种方式的比较:不用保留字表的优点是能提高速度,但它使得自动机的状态数随着保留字个数的增多而急剧变大。,2. 复合单词的识别 在程序设计语言中,有一类单词是由两个或者两个以上的符号组成的,这类单词的前缀部分也可以是一个独立的单词,如“:=”,在处理到“:”时,还不能断定这个单词是“:”,还是“:=”的前缀,这取决于“:”的下一个字符,如果下一个字符是“=”,则该单词为“:=”,否则为“:”。在处理这类单词时要特别加以注意。,3. 数的转换 词法分析程序应该把数字字符串转换成数,如“123”应该转换成123。 4. 向前看若干个字符的处理 在有些语言里,为了识别出一个单词需要向前看好几个字符。,5. 控制字符的处理 控制字符,如空格、Tab和回车换行等。这些字符将占用很大的空间,而且一般来说,它们只有词法意义而没有语法和语义上的意义(字符串内的控制字符例外)。 若Tab和空格符用来分隔源程序中不同的单词,则直接将它们删除。 回车换行本身并没有实际意义,但是对于错误处理起着重要的作用,因此回车换行不能直接删除。,需要注意的是不能删除掉字符串内的Tab和空格符,因为它们任何时候都是有意义的符号。 在处理Tab和空格符时,可以设置一个标志变量,每当进入字符串内部时令其为真,这样就可以根据此变量的值来判断是否在字符串内部,如果不是在字符串内部,可以直接将它们删除。,6. 注释的处理 源程序中的注释没有任何语法和语义上的意义,因此在进行词法分析时可以直接将注释删除,而不必生成其TOKEN。,3.3.4 实现算法,首先给出词法分析程序中用到的一些基本操作。 Append(string, char):拼单词。 KeyWord(string):查保留字表,看string是否为保留字。若此函数返回0,则表示string是一个标识符,否则为保留字编码。 AddTable(table, string):入表操作,检查string在table中有没有出现,若有则返回其位置指针,若没有则将其插入到table的末尾,并返回该位置的指针。 BACK:源程序文件指针回退一个字符。,PROCEDURE Scanner(); BEGIN LS0: string:=“”; ReadChar(CurrentChar); case CurrentChar of AZ | az :goto LS1; 09:goto LS2; +:goto LS3; ;: goto LS4; :: goto LS5; : goto LS8; end;,LS1: string:=Append(string, CurrentChar); ReadChar(CurrentChar); case CurrentChar of AZ ,az , 09:goto LS1; other: BEGIN BACK; c:=KeyWord(string); if (c!=0) then return(c, “”); else begin pID:=AddTable(IdTable, string); return($id, pID); end; END end;,LS2: string:=Append(string, CurrentChar); ReadChar(CurrentChar); case CurrentChar of 09: goto LS2; other: BEGIN BACK; pNB:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 经销商培训流程:构建高效赋能体系
- 陕西省蓝田县焦岱中学高中语文 4 归去来兮辞(并序)教学设计4 新人教版必修5
- 培训课件设计与实施
- 小学美术冀美版六年级下册9.重复与渐变教案
- 内资公司注册培训
- 小学英语川教版四年级下册Lesson 3 There are many animals教案
- 劳动合同的模板
- 公司与员工租房合同范本
- 离婚协议中关于个人财产分割的合同
- 人力资源服务合作合同
- 导线的连接精品课件
- 论提高行政效率的途径 开题报告
- 059.商业计划书和可行性报告精制食油厂年产万吨精制山茶油项目可行性研究报告
- 米度盾构导向系统
- [说明]心血管内科(心内科)_见习教案_6_动脉粥样硬化和冠状动脉粥样硬化性心脏病
- Q∕GDW 11257.3-2020 熔断器技术规范 第3部分:跌落式熔断器
- 汽车焊接夹具设计外文文献翻译
- 浓缩机的选择与计算
- 沪教版六年级下册单词表
- 红星美凯龙租赁合同
- 最新投标书密封条
评论
0/150
提交评论