第2章--编译原理词法分析优秀PPT.ppt
《第2章--编译原理词法分析优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第2章--编译原理词法分析优秀PPT.ppt(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第2 2章章 词法分析词法分析 2.1 词法分析器设计方法词法分析器设计方法 词法分析是编译的第一个阶段,其任务是:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成为单词符号串形式的中间程序。执行词法分析的程序称为词法分析程序,也称为词法分析器或扫描器。词法分析器的功能是输入源程序,输出单词符号。第第2 2章章 词法分析词法分析 词法分析可以接受如下两种处理结构:(1)把词法分析程序作为主程序。将词法分析工作作为独立的一遍来完成,即把词法分析与语法分析明显分开,由词法分析程序将字符串形式的源程序改造成单词符号串形式的中间程序,以这个中间程序作为语法分析程序的
2、输入。在这种处理结构中,词法分析和语法分析是分别实现的,如图21(a)所示。第第2 2章章 词法分析词法分析 (2)把词法分析程序作为语法分析程序调用的子程序。在进行语法分析时,每当语法分析程序须要一个单词时便调用词法分析程序,词法分析程序每一次调用便从字符串源程序中识别出一个单词交给语法分析程序。在这种处理结构中,词法分析和语法分析事实上是交替进行的,如图21(b)所示。由于把词法分析器支配成一个子程序比较自然,因此,词法分析程序通常接受其次种处理结构。第第2 2章章 词法分析词法分析 图2-1词法分析的两种处理结构(a)词法分析程序作为主程序;(b)词法分析程序作为子程序第第2 2章章 词
3、法分析词法分析 2.1.1单词符号的分类与输出形式1单词符号分类词法分析程序简洁地说就是读单词程序,该程序扫描用高级语言编写的源程序,将源程序中由单词符号组成的字符串分解出一个个单词来。因此,单词符号是程序语言的基本语法单位,具有确定的语法意义。程序语言的单词符号通常可分为下面五种:第第2 2章章 词法分析词法分析 (1)保留字(也称基本字):如C语言中的if、else、while和do等,这些字保留了语言所规定的含义,是编译程序识别各类语法成分的依据。几乎全部程序语言都限制用户运用保留字来作为标识符。(2)标识符:用来标记常量、数组、类型、变量、过程或函数名等,通常由用户自己定义。(3)常数
4、:包括各种类型的常数,如整型常数386、实型常数0.618、布尔型常数TRUE等。第第2 2章章 词法分析词法分析 (4)运 算 符:如“+”、“?”、“*”、“/”、“”、“”等。(5)界符:在语言中是作为语法上的分界符号运用的,如“,”、“;”、“(”、“)”等。一个程序语言的保留字、运算符和界符的个数是确定的,而标识符或常数的运用则不限定个数。第第2 2章章 词法分析词法分析 2词法分析程序输出单词的形式我们知道,词法分析程序的输入是源程序字符串,而输出是与源程序等价的单词符号序列,并且所输出的单词符号通常表示成如下的二元式:(单词种别,单词自身的值)(1)单词种别。单词种别表示单词的种
5、类,它是语法分析所须要的信息。一个语言的单词符号如何划分种类、分为几类、如何编码都属于技术性问题,主要取决于处理上的便利。通常让每种单词对应一个整数码,这样可最大限度地把各个单词区分开来。第第2 2章章 词法分析词法分析 对于保留字,可将其全体视为一种,也可一字一种,接受一字一种的分类方法处理起来比较便利;标识符一般统归为一种;常数可统归为一种,也可按整型、实型、布尔型等分为几种;运算符和界符可接受一符一种的分法,也可统归为一种。第第2 2章章 词法分析词法分析 (2)单词自身的值。单词自身的值是编译中其它阶段所须要的信息。对于单词符号来说,假如一个种别只含有一个单词符号,那么对于这个单词符号
6、,其种别编码就完全代表了它自身的值。假如一个种别含有多个单词符号,那么对于它的每个单词符号,除了给出种别编码之外还应给出单词符号自身的值,以便把同一种类的单词区分开来。留意,标识符自身的值就是标识符自身的字符串,而常数自身的值是常数本身的二进制数值。此外,我们也可用指向某类表格中一个特定项目的指针来区分同类中的不同单词。例如,对于标识符,可以用它在符号表的入口指针作为它自身的值;而常数也可用它在常数表的入口指针作为它自身的值。第第2 2章章 词法分析词法分析 2.1.2状态转换图在词法分析中,可以用状态转换图来识别单词。状态转换图是有限的有向图,结点代表状态,用圆圈表示;结点之间可由有向边连接
7、,有向边上可标记字符。例如,图2-2表示在状态i下,若输入字符为x,则读入x并转换到状态j;若输入字符为y,则读入y并转换到状态k。状态(即结点)数是有限的,其中必有一初始状态以及若干终止状态,终止状态(终态)的结点用双圈表示以区分于其它状态。图2-3给出了用于识别标识符、无符号整数、无符号数的状态转换图,其初始状态均用0状态表示。第第2 2章章 词法分析词法分析 图22不同输入字符的状态转换第第2 2章章 词法分析词法分析 图2-3标识符及无符号数的状态转换图(a)标识符;(b)无符号整数;(c)无符号数第第2 2章章 词法分析词法分析 当到达一类单词符号的终止状态时即可给出相应的单词编码。
8、某些终止状态是在读入了一个其它不属于该单词的符号后才得到相应的单词编码的,这表明在识别单词的过程中多读入了一个符号,所以识别出单词后应将最终多读入的这个符号予以回退;我们对此类状况的处理是在终态上以“*”作为标识。对于不含回路的分支状态来说,可以让它对应一个switch()语句或一组if-else语句。例如,图2-4(a)的状态i所对应的switch语句如下:第第2 2章章 词法分析词法分析 s=getchar();switch(s)casea:caseb:casez:;/*实现状态j功能的语句*/case0:case1:case9:;/*实现状态k功能的语句*/第第2 2章章 词法分析词法分
9、析 对于含回路的状态来说,可以让它对应一个while语句。例如,图2-4(b)的状态i所对应的while语句如下:getchar();while(letter()|chgit()getchar();/*实现状态j功能的语句*/终态一般对应一个return()语句;return意味着从词法分析器返回到调用段,一般指返回到语法分析器。第第2 2章章 词法分析词法分析 图2-4含有分支或回路的状态示意(a)含分支的状态i;(b)含回路的状态i第第2 2章章 词法分析词法分析 2.2 一个简洁的词法分析器示例一个简洁的词法分析器示例 2.2.1C语言子集的单词符号表示一个特别重要的事实是:大多数程序语
10、言的单词符号都可以用状态转换图予以识别。作为一个综合例子,我们来构造一个C语言子集的简洁词法分析器。表2.1列出了这个C语言子集的全部单词符号以及它们的种别编码和内码值。由于干脆运用整数编码不利于记忆,故该例中用一些特殊符号来表示种别编码。第第2 2章章 词法分析词法分析 表2.1C语言子集的单词符号及内码值单词符号种别编码助记符内码值while1whileif2ifelse3elseswitch4switchcase5case标识符6idid在符号表中的位置常数7numnum在常数表中的位置+8+9*10*=11relopLE11relopLT=11relopEQ=12=;13;第第2 2章
11、章 词法分析词法分析 2.2.2C语言子集对应的状态转换图在设计的状态转换图中,首先对输入串做预处理,即剔除多余的空白符(在实际的词法分析中,预处理还包括剔除注释和制表换行符等编辑性字符的工作),使词法分析工作既简洁又清晰。其次,将保留字作为一类特殊的标识符来处理,也即对保留字不专设对应的状态转换图,当转换图识别出一个标识符时就去查对表2.1的前五项,确定它是否为一个保留字。当然,也可以专设一个保留字表来进行处理。图25就是对应表2.1这个简洁词法分析的状态转换图。第第2 2章章 词法分析词法分析 图25简洁词法分析的状态转换图第第2 2章章 词法分析词法分析 在状态2时,所识别出的标识符应先
12、与表2.1的前五项逐一比较,若匹配,则该标识符是一个保留字,否则就是标识符。假如是标识符,应先查符号表,看表中是否有此标识符。若表中无此标识符,则将它登录到符号表中,然后返回其在符号表中的入口指针(地址)作为该标识符的内码值;若表中有此标识符,则给出重名错误信息。在状态4时,应将识别的常数转换成二进制常数并将其登录到常数表,然后返回其在常数表中的入口指针作为该常数的内码值。第第2 2章章 词法分析词法分析 2.2.3状态转换图的实现状态转换图特别简洁用程序实现,最简洁的方法是让每个状态对应一小段程序。对于图25的状转换图,我们首先引进一组变量和过程如下:(1)character:字符变量,存放
13、最新读入的源程序字符。(2)token:字符数组,存放构成单词符号的字符串。(3)getbe():若character中的字符为空白,则调用getchar(),直至character为非空白符为止。第第2 2章章 词法分析词法分析 (4)concatenation():将token中的字符串与character中的字符连接并作为token中新的字符串。(5)letter()和digit():推断character中的字符是否为字母和数字的布尔函数,是则返回true,否则返回false。(6)reserve():按token数组中的字符串查表2.1中的前五项(即判别其是否为保留字),若是保留字则
14、返回它的编码,否则返回0值。第第2 2章章 词法分析词法分析 (7)retract():扫描指针回退一个字符,同时将character置为空白。(8)buildlist():将标识符登录到符号表或将常数登录到常数表。(9)error():出现非法字符,显示出错信息。相对于图2-5的词法分析器构造如下:第第2 2章章 词法分析词法分析 token=;/*对token数组初始化*/s=getchar();getbe();/*滤除空格*/switch(s)casea:caseb:casez:while(letter()digit()第第2 2章章 词法分析词法分析 concatenation();/
15、*将当前读入的字符送入token数组*/getchar();retract();/*扫描指针回退一个字符*/c=reserve();if(c=0)buildlist();/*将标识符登录到符号表中*/return(id,指向id的符号表入口指针);第第2 2章章 词法分析词法分析 elsereturn(保留字码,null);break;case0:case1:case9:while(digit()concatenation();getchar();retract();第第2 2章章 词法分析词法分析 buildlist();/*将常数登录到常数表中*/return(num,num的常数表入口指
16、针);break;case+:return(+,null);break;case?:return(?,null);break;case*:return(*,null);第第2 2章章 词法分析词法分析 break;case:getchar();if(character=)return(relop,LE);elseretract();return(relop,LT);break;case=:getchar();if(character=)第第2 2章章 词法分析词法分析 return(relop,EQ);elseretract();return(=,_);break;case;:return(;
17、,_);break;default:error();第第2 2章章 词法分析词法分析 2.3 正规表达式与有限自动机简介正规表达式与有限自动机简介 2.3.1正规表达式与正规集状态转换图对构造词法分析程序是行之有效的,为了便于词法分析器的自动生成,还须将状态转换图的概念加以形式化。正规表达式就是一种形式化的表示法,它可以表示单词符号的结构,从而精确地定义单词符号集。正规表达式简称为正规式,它表示的集合即为正规集。为了理解正规式与正规集的含义,我们以程序语言中的标识符为例予以说明。第第2 2章章 词法分析词法分析 程序语言中运用的标识符是一个以字母开头的字母数字串,假如字母用letter表示,数
18、字用digit表示,则标识符可表示为letter(letterdigit)*其中,letter与(letterdigit)*的并置表示两者的连接;括号中的“”表示letter或digit两者选一;“*”表示零次或多次引用由“*”标记的表达式;(letterdigit)*是letterdigit的零次或多次并置,即表示一长度为0、1、2、的字母数字串;letter(letterdigit)*表示以字母开头的字母数字串,也即标识符集。letter(letterdigit)*就是表示标识符的正规式,而标识符集就是这个正规式所表示的正规集。第第2 2章章 词法分析词法分析 对于给定的字母表,正规式和正
19、规集的递归定义如下:(1)和都是上的正规式,它们所表示的正规集分别为和。(2)对任一个a,a是上的一个正规式,它所表示的正规集为a。(3)假如R和S是上的正规式,它们所表示的正规集分别为L(R)和L(S),则:第第2 2章章 词法分析词法分析 RS是上的正规式,它所表示的正规集为L(R)L(S);R.S是上的正规式,它所表示的正规集为L(R)L(S);(R)*是上的正规式,它所表示的正规集为(L(R)*;R也是上的正规式,它所表示的正规集为L(R)。第第2 2章章 词法分析词法分析 (4)仅由有限次运用规则(1)(3)得到的表示式是上的正规式,它所表示的集合是上的正规集。在上述定义中,规则(1
20、)、(2)为基础规则,规则(3)为归纳规则,规则(4)是界限规则或终止规则。此外,上的一个字是指由中的字符所构成的一个有穷序列;不包含任何字符的序列称为空字,用表示。我们用*表示上全部字的全体,则空字也在其中。例如,若=a,b,则*=,a,b,aa,ab,ba,bb,aaa,。我们还用表示不含任何元素的空集。这里须要留意、和的区分:是由空字组成的集合,而则表示不含任何字的集合。1第第2 2章章 词法分析词法分析 正规式间的运算符“”表示或,“”表示连接(通常可省略),“*”表示闭包,运用括号可以变更运算的次序。假如规定“*”优先于“”,“”优先于“”,则在不出现混淆的状况下括号也可以省去。留意
21、,*的正规式R和S的连接可以形式化地定义为RS=R&S即集合RS中的字是由R和S中的字连接而成的,且R自身的n次连接记为第第2 2章章 词法分析词法分析 我们规定R0=,并令R*=R0R1R2R3,则称R*是R的闭包;此外,令R+=RR*,并称R+是R的正闭包。闭包R*中的每个字都是由R中的字经过有限次连接而成的。对于上的正规式R和S,假如它所表示的正规集L(R)=L(S),则称R和S等价并记为R=S。不难证明,正规式具有下列性质:(1)交换律:RS=SR。(2)结合律:R(ST)=(RS)T;R(ST)=(RS)T。(3)安排律:R(ST)=RSRT;(RS)T=RTST。(4)同一律:R=
22、R=R。第第2 2章章 词法分析词法分析 例2.1令=a,b,设R=a(ab)*是上的正规式,试求其表示的正规集。解答L(R)=L(a(ab)*)=L(a)L(ab)*)=L(a)(L(ab)*=L(a)(L(a)L(b)*=a(ab)*=aa,b*=a,a,b,aa,ab,ba,bb,aaa,=a,aa,ab,aaa,aab,aba,abb,aaaa,例2.2推断下述正规式之间是否等价:(1)(ab)*与a*b*(2)(ab)*与a*b*(3)(ab)*与(a*b*)*第第2 2章章 词法分析词法分析 解答(1)(ab)*对应的正规集其a、b可随意交替出现,如abbaaaba;而(a*b*)
23、对应的正规集只可出现随意个a或者随意个b;因此两者不等价。(2)(ab)*对应的正规集是以随意个ab对出现的,即ababab;而a*b*对应的正规集则是先出现随意个a后接随意个b,即aabb;因此两者不等价。(3)由于(ab)*对应的正规集其a、b可随意交替出现,如aababbb;而(a*b*)*可接受如下构造方法得到字aababbb:(a*b*)2=(a*b*)0(a2b1)1(a1b3)2=aababbb反之,对(a*b*)*产生的随意字也可由(ab)*得到,即两者是等价的。第第2 2章章 词法分析词法分析 例2.3证明:设L(a+)=a*?,则有a+=aa*。证明L(a+)=a*?=,a
24、,a2,a3,?=a,a2,a3,=a,a,a2=aa*=L(a)L(a*)=L(aa*)故a+=aa*第第2 2章章 词法分析词法分析 2.3.2有限自动机有限自动机(FA)是更一般化的状态转换图,它分为确定有限自动机DFA和非确定有限自动机NFA两种。1确定有限自动机(DFA)一个确定的有限自动机Md(记为DFAMd)是一个五元组Md=(S,f,s0,Z),其中:(1)S是一个有限状态集,它的每一个元素称为一个状态;(2)是一个有穷输入字母表,它的每一个元素称为一个输入字符;第第2 2章章 词法分析词法分析 (3)f是一个从S到S的单值映射,即f(si,a)=sj且有si、sjS和a;(4
25、)s0S,是惟一的一个初态;(5)Z(S,是一个终态集。例如,对图2-6所给出的状态s1有:f(s1,a)=s2f(s1,b)=s3f(s1,c)=s4因此,f是单值映射函数。第第2 2章章 词法分析词法分析 图2-6DFA的状态转换示意第第2 2章章 词法分析词法分析 2非确定有限自动机(NFA)一个非确定有限自动机Mn(记为NFAMn)是一个五元组Mn=(S,f,Q,Z),其中:(1)S、Z的意义与DFA相同;(2)f是一个从S*到S的子集映射;(3)Q(S,是一个非空初态集。第第2 2章章 词法分析词法分析 NFA和DFA的区分主要有两点:其一是NFA可以有若干个初始状态,而DFA仅有一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 优秀 PPT
限制150内