第3章 词法分析课件

上传人:我*** 文档编号:141291580 上传时间:2020-08-06 格式:PPT 页数:24 大小:100KB
返回 下载 相关 举报
第3章 词法分析课件_第1页
第1页 / 共24页
第3章 词法分析课件_第2页
第2页 / 共24页
第3章 词法分析课件_第3页
第3页 / 共24页
第3章 词法分析课件_第4页
第4页 / 共24页
第3章 词法分析课件_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《第3章 词法分析课件》由会员分享,可在线阅读,更多相关《第3章 词法分析课件(24页珍藏版)》请在金锄头文库上搜索。

1、第3章 词法分析,词法分析程序又称词法分析器或扫描器,是编译过程的第一步,是下一步进行语法分析的基础。 3.1词法分析的功能 3.2 程序语言的单词符号种类及词法分析输出 3.3 正则文法及状态图 3.4 词法分析程序的设计与实现,3.1词法分析的功能,扫描源程序字符流,按照源语言的词法规则识别出各类单词符号,并产生用于语法分析的符号序列,即将字符串源程序转换成符号串源程序。程序设计语言的保留字或关键字、标识符、常数、各种运算符等都是单词符号的例子。词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检

2、查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。,词法分析与语法分析之间的关系通常有两种形式: 1.词法分析作为独立的一遍 词法分析可作为单独一遍来实现。这种词法分析的输出存入一个中间文件供语法分析使用。这样通过词法分析,就可以将字符串源程序转换成符号串源程序,如图3.1。,字符串源程序,词法分析,符号串源程序,图3.1 词法分析单独作为一遍,3.1词法分析的功能,2.词法分析程序作为语法分析程序的子程序 有些编译程序将词法分析和语法分析安排在同一遍中,此时词法分析作为语法分析程序的一个子程序。每当语法分析需要一个新的符号时,就

3、调用词法分析子程序,词法分析子程序从字符串源程序中识别出一个具有独立意义的单词,将其符号返给语法分析。这种方法避免了中间文件,省去了送取符号工作,有利于提高编译程序的效率,如图3.2。,3.2 程序语言的单词符号种类及词法分析输出,词法分析的功能是为识别出的具有独立意义的单词,而输出的就是这些单词的符号。在程序设计语言中,单词符号是最基本的语法单位,具有确定的语法意义。通常程序语言的单词符号有: 保留字:如if、while、for等等。这些保留字在程序语言中具有固定的意义,是编译程序识别各类语法成分的依据,用户不能用它们作标识符。 标识符:由用户定义,用来表示各种名字,如变量名、函数名、数组名

4、等等。 无符号数:如125、0.788、15.2 分界符:如+、-、*、/、;、(、)等单分界符,还有=、=、!=、+等双分界符 . 词法分析的输出常采用二元式,如图3.3所示。,图3.3 词法分析程序的输出形式,3.2 程序语言的单词符号种类及词法分析输出,单词类别通常用一个整数类码或单词记号表示,单词记号比整数码含义明确。例如,保留字FOR,可直接用同样的字符串FOR作为单词记号来表示,而如果用整数类码,含义就不直观。用汇编编写词法分析程序,单词类别常用整数表示,因为用单词记号处理起来比较麻烦。而如果用高级语言编写词法分析程序,那么采用单词记号则更自然些,因为高级语言提供了字符串处理函数,

5、处理助记符号不再烦琐。一个语言的单词类别如何分类、分成几类、怎样编码,主要取决于技术处理上的方便。标识符一般归为一类,常数则按类型(整数、实数等)分类。保留字即可将全体定为一类,也可一字一类。分界符可单独作为一类,也可采用一符一类的分法。采用一字一类或采用一符一类的分法实现处理起来更方便一些。因为,如果一个类别只含一个单词符号,那么,对于这个单词符号,类别编码就完全代表它自身的值,词法分析就不必输出其值了。,3.3 正则文法及状态图,程序设计语言的单词符号可用3型文法来描述,3型文法也称为正则文法。对于正则文法所描述的语言可以用一种有穷自动机来识别。我们的目的是实现词法分析程序,所以为了简化问

6、题,我们直接介绍这种自动机的非形式表示,即状态图。,3.3.1 状态图 所谓“状态图”就是一张有穷的有向图。图中的结点代表状态,用圆圈表示,状态间用有向弧线连接,连接弧上标记有符号,表示在弧线射出端的状态下,读入弧线上标记的符号可转换到弧线指向的状态。状态图只有有穷个状态,其中有一个是开始状态,至少有一个状态是结束状态,结束状态常用双圈表示。,3.3.1 状态图,正则文法形式为: Ua 或U=Wa, 其中: U,WVn(非终结符号集), a Vt(终结符号集) 正则文法的状态图画法如下: 文法中的每个非终结符号对应状态图中的一个结点,即图中的每个结点代表一个非终结符号。 增设一个结点代表开始状

7、态S,而文法中的开始符号对应的结点为终结状态 对于文法中的每一条形如Ua的规则,画一条从结点S指向结点U的弧线,并在弧上标记a。 对于文法中每一条形如U=Wa的规则,画一条从结点W指向结点U的弧线,并在弧上标记a。,3.3.1 状态图,例3.1,设有正则文法GZ: ZU0|V1 UZ1|1 VZ0|0 画出该文法对应的状态图。,解:根据状态图的画法,首先确定状态图的结点。文法中有三个非终结符号Z、U、V,加上代表开始状态S的结点,因此共有四个结点,其中S结点为开始状态,Z结点为终结状态。对于规则ZU1|V1,则分别从结点U和结点V画指向结点Z的弧线,并分别在弧线上标记0和1;对于规则UZ1|1

8、,从Z画指向U的弧线,从S画指向U的弧线,并分别在弧线上标记为1;对于规则VZ0|0,分别从Z和S画指向V画弧线,并分别在弧线上标记0。最终,我们可以画出该文法的状态图,如图3.4所示。,图3.4 状态图,3.3.2 状态图的用法,状态图画好后,就可以利用状态图来分析和识别字符串,其方法如下: 1.首先设置初始状态S为当前状态。从输入串的最左字符开始重复步骤2,直到到达输入串的右端为止。 2.扫描输入串的下一个字符,在当前状态所射出的弧中,找出标记有该字符的弧,并沿此弧前进,过渡到下一个状态。如果找不到标记有该字符的弧,则说明输入串不是合法的句子,分析过程失败结束;如果我们扫描输入串的最后一个

9、字符,并从当前状态出发沿着标记有该字符的弧到达终结状态,则表示输入串是该文法的合法句子,识别过程成功结束;如果扫描输入串的最后一个符号后到达的状态不是状态图的终结状态,则表示输入串不是该文法的合法句子,识别过程失败结束。 利用状态图识别句子的方法是一种自底向上的分析方法。开始时,处于开始状态,此时句柄是随后扫描的字符,即输入串的的第一个符号,所要归约的符号就是从开始状态经过标记有句柄符号的弧到达的下一个状态的名字。以后每一步(除第一步外)的句柄是当前状态的名字和随后扫描的字符,而句柄所要归约的符号就是下一个状态的名字。,3.3.2 状态图的用法,例3.2,对句子0110进行的分析。 解:根据上

10、面介绍的状态图使用方法,我们在图3.5(a)列出分析的每一步。由于这些规则很简单,所以分析也非常简单。首先,在开始状态S下扫描的第一个符号是0,转到状态V,表示0是句柄,归约到V。接下来,在状态V扫描1,转到状态Z,此时句柄为V1,归约成Z。再往下扫描1,由状态Z转到状态U,表示句柄为Z1归约为U。最后,扫描0,转到状态Z,此时句柄为U0,归约为Z,从而形成图3.5(b)所示的语法树。,3.5(a)输入串0110分析过程,图3.5(b)输入串0110的语法树,3.3.2 状态图的用法,从上例的分析过程可看出,因为非终结符号仅作为规则右部第一个符号出现,所以,第一步总是把句子的第一个符号作为句柄

11、归约成一个非终结符号。其后各步总是应用形式为U=Wa的规则,把句型Wat的头两个符号归约成一个非终结符号U。在执行这个规约时,当前状态的名字是W,扫描的字符是a,下一个状态是U。因为每个右部是唯一的,所以规约的符号也是唯一的。,3.4 词法分析程序的设计与实现,3.4.1 TEST语言的词法规则及状态图 TEST语言是本书中专门设计的一种程序语言,它在语法上与C语言类似,但要比C语言简单的多。它的所有变量都是整型变量。它具有IF、WHILE、FOR等控制语句。注释用“/*”和“*/”括起来,但注释不能嵌套。TEST的表达式局限于布尔表达式和算术表达式。 TEST语言的单词符号有: 标识符:na

12、me,aaa 保留字(它是标识符的子集): if,else,for,while,do,int,read,write 无符号整数:100,256 分界符:如+、-、*、/、(、)、;、!等单分界符,还有双字符分界符=、=、!=、=、/等。 注释符:用/*.*/括起 或 从/到行尾 词法分析程序并不输出注释,在词法分析阶段,注释的内容将被删掉。为了从源程序字符流中正确识别出各类单词符号,相邻的标识符、整数或保留字之间至少要用一个空格分开。,TEST语言的各类单词符号的正则文法规则如下:,=|ID|ID =|NUM = a|b|z|A|B|Z =1|2|9|0 =+|-|*|/|=|(|)|:|,|

13、;|! =|=|!=|= =/* =*/ 上述规则中,标识符、无符号整数、双字符分界符以及注释规则表面看不是正则文法,但只要一转换可变成正则文法。如将标识符规则中的字母分别用实际字母代入,就是正则文法,如下所示:,TEST语言的各类单词符号的正则文法规则如下:,ID=a|b|z|ID符a|IDz |ID0|ID9 NUM=0|1|9|NUM0|NUM9 doubleword=| = = = 上述部分各条词法规则的状态图如图3.6所示。 注意:由于部分单分界符与双分界符或注释的头符号相同,如、=、*和/,所以这些单分界符要在双分界符或注释中处理。,TEST语言的各类单词符号的正则文法规则如下:,

14、图3.6各条词法规则的状态图,TEST语言的各类单词符号的正则文法规则如下:,图3.7单词符号的状态图,3.4.2 TEST语言词法分析程序的构造,有了状态图后,根据分析的相应动作就可以画出词法分析程序的算法流程图,如图3.8。在程序开始时,首先读入一个字符,若为空字符,则继续读,直到读进一个非空字符,然后根据读进的字符进行不同的处理。当这个字符是: 1)字母:继续读,直到遇见空格、或单字符分界符、或文件尾。组合字符串,查保留字表。若为保留字,输出相应类码。若无,输出标识符的单词记号及单词值(标识符); 2)数字:继续读,直到非数字字符出现或文件尾。输出无符号整数的单词记号及数字串; 3) =

15、、!:读下一个字符,判断是否为双字符分界符,若是,组成双字符分界符,输出类码;若不是,输出单分界符记号; 4)非=、/等与双分界符首字符不同的单分界字符:输出相应单词记号及单分界符。 5)/:读下一个。若不是,输出/的类码;若是*,进行注释处理。词法分析不输出“/*”,并要跳过整个注释内容直到遇到“*/”为止,然后返回开始状态,继续识别下一个单词符号。 6)非法字符:如果读进的字符不属于上面任意情况,则说明词法分析程序从源程序读入了一个不合法的字符,即该字符不属于程序语言所定义的所有单词符号的首字符集合。词法分析程序在遇到不合法字符时要进行错误处理,报告错误信息,跳过这个字符,然后转入开始状态

16、,继续识别下一个单词符号。,3.4.2 TEST语言词法分析程序的构造,在设计词法分析程序时要注意,为了识别标识符、无符号整数及与双分界符首字符相同的单分界符时,我们需要向前多读一个字符,因此,在具体实现词法分析程序时,遇到这种情况在返回开始状态识别下一个单词符号时,需要回退一个字符。如果不回退,也可约定,识别出一个单词符号后返回开始状态时,已将下一个字符读进,这时就要在识别那些不需要超前读字符就可识别的单词符号后,要再读一个字符,以保证每次返回开始状态识别下一个单词时,已经读进了下一个字符。本节介绍的程序就采用这种方式,因此,在纯单分符处理分支、双分符处理分支后都添加了读字符,同样,在处理了注释后,也要注意将下一个字符读进来。,3.4.2 TEST语言词法分析程序的构造,图3.8 词法分析程序框图,3.4.3 TEST语言的词法分析程序实现,1、输出形式 为了使词法分析的输出含义明确、易于理解,本程序对识别出的每个单词符号输出两项内容:一是单词记号,二是单词值。对于保留字、分界符直

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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