词法分析(编译原理陈火旺).ppt
《词法分析(编译原理陈火旺).ppt》由会员分享,可在线阅读,更多相关《词法分析(编译原理陈火旺).ppt(108页珍藏版)》请在三一办公上搜索。
1、1,词法分析是编译的第一个阶段,在单词的级别上分析和翻译源程序。理论基础:有限自动机理论 有限自动机理论与正规文法、正规式之间在描 述语言方面有一一对应的关系。,第3章 词法分析,2,内容:状态转换图、正规式和有限自动机、词法分析器的自动生成掌握:正规式、状态转换图,DFN的概念、NFA的概念,将NFA转 换为DFA、DFA的化简、正规式与有限自动机间的转换。理解:正规文法与有穷自动机间的转换 词法分析器的自动产生工具LEX,第3章 词法分析,教学要求,3,本章在编译程序中的地位,4,执行词法分析的程序称为又称为词法分析器或扫描器.词法分析的任务:从左至右逐个地扫描源程序的字符串,按照词法规则
2、识别出一个个正确的单词,并转换为相应的二元式形式,交给语法分析使用。把作为字符串的源程序改造成单词符号串的词法分析是编译的基础。,3.1 设计词法分析器时应考虑的几个问题,5,3.1.1 词法分析阶段的必要性,词法分析的工作纳入整个语法分析中一揽子地进行,原则上是可行的。在设计一个编译程序时,通常是把对源程序的结构分析分为词法分析和语法分析两个相对独立的阶段来完成。第一,描述单词的结构比描述源程序的其它语法结构要简单得多,仅使用3型文法也就基本够用了。第二,由于把词法分析和语法分析分开,可使编译程序各部分的功能更为单一,整个编译程序的结构也更加清晰,从而有利于编译程序的编写和调整。上述词法分析
3、和语法分析两个阶段的划分,仅仅是对整个编译程序的逻辑功能而言,而不一定指的是编译程序的执行流程。,6,3.1.2 词法分析器的输出形式,词法分析器输出的单词常常表示为二元式形式(单词种别,单词符号的属性值)单词种别提供给语法分析程序使用;单词符号的属性值提供给语义分析程序使用。具体的分类设计方法以方便语法分析程序使用为原则。,7,3.1.2 词法分析器的输出形式,程序语言的单词符号一般分为五种:关键字(保留字或基本字):如 if,then,else,while,do等 标识符:用来表示各种名字,如 x1常量:如 256,3.14,true,abc 运算符:如、*、/等等分界符:如 逗号,分号,
4、冒号等,8,3.1.2 词法分析器的输出形式,单词种别:一个语言的单词符号如何分类、分为几类、如何编码主要取决于处理上的方便。通常,每种单词对应一个整数码。注意:保留字、运算符和界符的个数确定,标识符和常数的个数不确定。保留字:可全体视为一种,也可一字一种;标识符:统归为一种;常数:统归为一种,或按整、实、布尔等再分;运算符和界符:一符一种,或统归为一种。,9,3.1.2 词法分析器的输出形式,单词符号的属性值 单词符号的属性是指单词符号的特征值。如果一个种别只含有一个单词符号,那么对于这个单词符号,种别编码就完全代表它自身了,因而不需要属性值。若一个种别含有多个单词符号,那么,对于它的每个单
5、词符号,除了给出种别编码之外,还应给出有关单词符号的属性值。,10,3.1.2 词法分析器的输出形式,单词符号的属性值标识符和常数 标识符的内部码(如ASCII码等等)和常数本身的值(二进制,逻辑值等)来表示。标识符的符号表入口地址作为其单词符号的属性值,常量在其常量表中的入口地址作为其单词符号的属性值。每个基本字占一个单词种别,单词符号的属性值缺省。对于界符,运算符通常一个符号一个种别,单词符号的属性值缺省例:参见P42.表3.1 单词符号及种别编码,11,3.1.3 词法分析器作为独立子程序,词法分析可采用如下两种处理结构:把词法分析程序作为主程序。将词法分析作为独立的一遍来完成。把词法分
6、析程序作为语法分析程序调用的子程序。每当语法分析器需要一个单词符号时就调用这个子程序。每一次调用,词法分析器从源程序字符串中识别出一个单词符号,并把它的内部表示二元组交给语法分析器处理。,12,3.1.4 源程序的输入、预处理及超前搜索,词法分析器工作的第一步是输入源程序文本。输入串一般放在一个输入缓冲区中。词法分析器的工作可以直接在输入缓冲区中进行。但在许多情况下,可以先预处理输入串,识别工作将更方便。(参见P40 图3.1),13,3.1.4 源程序的输入、预处理及超前搜索,预处理的原因 源程序中包含回车,换行,多余空白符,注释行等编辑字符,它们对程序逻辑功能无任何影响,在词法分析之前,首
7、先要剔除掉这些符号,使得词法分析更为简单。一行语句结束应配上一个特殊字符说明。有些语言要识别标号区,区分标号语句,找出续行符连接成完整语句等。输出源程序清单以便复核。预处理子程序任务 从输入缓冲区中读取源程序,预处理后送入扫描缓冲区。此时,扫描缓冲区的字符都是有效字符。词法分析程序这时可以再对扫描缓冲区进行扫描。,14,3.1.4 源程序的输入、预处理及超前搜索,超前搜索 对于有些语言,关键字不保护,关键字与用户自定义标识符间没有界符,要在上下文环境中识别单词,这时需要超前搜索方法来识别关键字。例如:FORTRAN语言:1.DO10K=1,50 2.DO10K=1.50扫描缓冲区的结构(自学)
8、,15,扫描缓冲区的结构,词法分析器对扫描缓冲区进行扫描时一般使用两个指示器,一个指向当前正在识别的单词的开始位置,即指向新单词的首字符;另一个用于向前搜索以寻找单词的终点。不论扫描缓冲区设得多大都不能保证单词符号不会被缓冲区的边界所打断。因此,扫描缓冲区最好使用如下一分为二的区域:,16,在扫描缓冲区中扫描,假定每个半个区可容120个字符,而这两个半区又是互补的。如果搜索指示器从单词起点出发搜索到一个半区的边缘但尚未达到单词的终点,那么就调用预处理子程序,令其把后续的120个字符装入另一个半区。认定在另一半区一定可以达到单词的终点。这意味着对标识符和常数的长度实际上必须加以限制,否则即使缓冲
9、区再大也无济于事。,17,词法分析程序设计,设计方法:写出该语言的词法规则;把词法规则转换为相应的状态转换图;把各转换图的初态连在一起,构成识别该 语言的自动机;(4)设计扫描器,18,3.2 正规文法和有限自动机,这节介绍词法规则的形式表示(正规式),从正规式向有限自动机的转化.,19,3.2.1 正规文法、正规集与正规式,正规文法:是chomsky3型文法。,例如:标识符这种单词可以用下面的规则描述|(|)表示任意字母,表示任意数字,注:正规文法描述是正规集的文法,可用于描述程序设计语言的语法部分。,20,对于一个正规文法的语言提炼出一个简洁的公式,用这个式子来对它进行形式化的表示,这个式
10、子叫正规式。正规式:也称正则表达式,是说明单词的模式的一种重要的表示法(记号);是定义正规集的数学工具;用来描述单词符号。,3.2.1 正规文法、正规式与正规集,注:正规集是集合,可有穷也可无穷。可通过正规式来形式化表示。,正规集:由正规文法产生的语言所构成的集合。,21,3.2.1 正规文法、正规式与正规集,下面以标识符为例说明正规式与正规集:标识符是以字母开头的字母数字串。若用L表示字母,用D表示数字,则标识符可表示为:L(L|D)*其中并置表示两者的连接,|表示两者选一,*表示零次或多次引用。L(L|D)*为标识符的正规式,该正规式表示的集合为标识符的正规集。,22,下面是正规式和它所定
11、义的正规集的递归定义。1),是 上的正规式,所表示的正规集为,;2)若 a,则 a 为正规式,所表示的正规集为 a;3)设U,V 为 上的正规式,所表示的正规集为 L(U),L(V);则 U|V为 上的正规式,所表示的正规集为 L(U)L(V);UV为 上的正规式,所表示的正规集为 L(U)L(V);V*为 上的正规式,所表示的正规集为(L(V)*;4)仅当有限次使用上述三步骤而定义的表达式,才是 上的正规式,而这些正规式所表示的字集才是上的正规集。,3.2.1 正规文法、正规式与正规集,或运算,连接积,23,说明:1上的一个字指的是由中字符构成的一个有穷序列;不包含任何字符的序列称为空字()
12、。*表示上所有字的全体,包括空字()。例如,若=a,b 则*=,a,b,aa,ab,ba,bb,aaa,2 表示不含任何元素的空集。注意、和的区别:表示不包含任何字符的序列,它是正规集中的一个元素;表示不含任何字的集合,它是一个空的正规集;表示由空字组成的集合。,3.2.1 正规文法、正规式与正规集,24,3 使用括号可改变运算符的运算次序。若规定*优先于,优先于|,则在不混淆情况下,可省 去括号。4 R自身的n次连接记为 Rn=RRR5 R0=,R*=R0R1R2R3,R*为R的闭包 R+=RR*,称R+是R的正闭包。闭包R*中的每个字都是由R中的字经过有限次连接而成的。6 对于正规式R和S
13、,若它们表示的正规集L(R)=L(S),则称R和S等价,记为R=S。,3.2.1 正规文法、正规式与正规集,25,正规式具有下列性质:(1)交换律:R|S=S|R(2)结合律:R|(S|T)=(R|S)|T,R(ST)=(RS)T(3)分配律:R(S|T)=RS|RT,(R|S)T=RT|ST(4)同一律:R=R=R,3.2.1 正规文法、正规式与正规集,例3.1=a,b,R=a(a|b)*是上正规式,试求R表示的正规集。解:L(R)=L(a(a|b)*)=L(a)L(a|b)*)=L(a)(L(a|b)*=L(a)(L(a)L(b)*=a(ab)*=aa,b*=a,a,b,aa,ab,ba,
14、bb,aaa,=a,aa,ab,aaa,aab,aba,abb,aaaa,上所有以a为首的字,26,例3.2 判断下述正规式之间是否等价:(1)b(ab)*与(ba)*b(2)(ab)*与a*b*,解:(1)b(ab)*对应的正规集是b后面出现任意多个ab对 L(b(ab)*)=b,bab,babab,(ba)*b对应的正规集是b前面可出现任意个ba对L(ba)*b)=b,bab,babab,因此两者等价。正规式b(ab)*及(ba)*b都描述以b开头且其后跟以零个或任意多个ab所组成的字符串等。故我们说两个正规式等价,,(2)(ab)*对应的正规集以任意个ab对出现,即 ababab,而a*
15、b*对应的正规集则是任意个a后接任意个b,即aabb,因此两者不等价。,27,例3.3:设=a,b,则正规式和正规集:ab(ab)(ab)a*(ab)*aab*,a,baa,ab,ba,bb,a,aa,aaa,aaaa,=an|n0,a,b,aa,ab,ba,bb,aaa,aab,abb,bab,bba,bbb.=a,b*a,ab,abb,abbb,abbbb,.=abn|n0,28,通过这一节的学习,要求能根据给出的简单正规式,会写出其表示的正规集。例3.4 令=a,b,其正规式和正规集如下:正规式 正规集 1.ba*2.a(a|b)*3.(a|b)*(aa|bb)(a|b)*,上所有以b为
16、首后跟着任意多个a的字。,上所有以a为首的字。,上所有含有两个相继的a或两个相继的b 的字。,29,例3.5:令=A,B,0,1,则:正规式 正规集(A|B)(A|B|0|1)*(0|1)(0|1)*问:正规式,0,110,0|1,1*表示的正规集是?,答:正规集分别是,0,110,0,1,1,11,111,=1*=1n|n0。,上的“标识符”的全体=A,B.A,B,0,1*上“数”的全体=0,1.0,1*,30,3.2.1 正规文法、正规式与正规集,三个概念之间的关系:一个正规语言可以用正规文法来定义,也可以用正规式来定义,有些正规语言很容易用文法定义,有些则用正规式定义更容易。一个正规语言
17、是一个集合(正规集),那么这个集合可以用正规文法来定义,也可以用正规式来定义。,31,3.2.2 有限自动机,有限自动机(Finite Automata FA)是一种识别装置,它能准确地识别正规集。它为词法分析程序的构造提供了方法和工具。是一种具有离散输入输出系统的数学模型。它具有有限数目的内部状态,系统可以根据当前所处的状态和面临的输入字符决定系统的后继行为。其当前状态概括了过去处理的信息。,32,3.2.2 有限自动机,有限自动机模型:,输入带,注:状态分为初始状态、中间状态和终止状态。终止状态可以有若干个,而初始状态一般只有一个。,状态变换,33,3.2.2 有限自动机,有限自动机模型:
18、,输入带,状态:初态,状态:中间,34,3.2.2 有限自动机,有限自动机模型:,输入带,状态:终态,状态:非终态,注:读头全部读完,且此时状态为终态,则说明此输入串正确。,注:读头全部读完,而此时状态不是终态,则说明此输入串错误。,状态的变换和符号的读入用一个图形结构来表示。(状态转换图),35,3.2.3 状态转换图 P41,状态转换图:状态转换图是一张有限方向图,只包含有限个状态,即有限个结点。P41 1.结点代表状态,用圆圈表示 2.终止状态用双圈表示 3.初始状态前标记符号“”来表示(可省)4.状态之间用箭弧连结,箭弧上的标记代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字
19、符类,箭弧标记表示状态转换的条件。5.状态图有一个初态,多个终态。6.状态转换图可识别一定的字符串(单词)。7.状态转换图用于表示单词结构,从状态转换图的初态到终态间,每条路径上字符的连接,就构成了该状态图的合法单词。,36,例3.6 P41 图3.2(a)表示:在状态1下,若输入字符为X,则读进X,并转换到状态2。若输入字符为Y,则读进Y,并转换到状态3。若输入字符非X和非Y,则此转换图不工作。,37,例3.7 P41 图3.2(b)表示:识别标识符的状态转换图如下:其中状态0为初态,2为终态;识别标识符的过程是:从初态0开始,若在状态0下输入字符为字母,则读进它,并转换到状态1。在状态1之
20、下,若输入字符为字母或数字,则读进它,并重新进入状态1。一直重复这个过程直到发现输入字符不再是字母或数字时(这个字符已经被读进)进入状态2;状态2是终态,意味着到此已识别出一个标识符;终态上打个星号表示单词尾部多跟一个字符,应该去掉。若在状态0时输入的字符不为“字母”,则意味着这个转换图不工作。,38,例3.8 P41 图3.2(c)表示:识别无符号整数的状态转换图如下:,在状态转换图中,到达单词符号的终态时即给出相应的单词编码。若到达终态时多读入了一个符号,则识别出该单词后再将多读入的那个符号退回。对此类情况的处理方法是在终态上以*作为标识。,39,例3.9 P41 图3.2(d)表示:识别
21、实数的状态转换图如下:,初态0终态7之间任意一个路径都表示一个实数。,小数形式的实数:,指数形式的实数:,该转换图可以识别下面形式的一些实数:123.,.123,123E3,123.456,123.45e2,.123E+10,123.456E-3 等,40,状态转换图识别字符串:综合例,一个非常重要的事实是,大多数程序语言的单词符号都可以用状态转换图予以识别。作为一个综合例子,教材P42-P46.构造了一个识别某个简单语言的所有单词符号的状态转换图,并给出了对应的词法分析程序。希望同学们好好读一下。为完成的实验-设计并实现一个小语言的词法分析程序,可以以这个例子做参考。,41,识别简单语言单词
22、符号的转换图,参见P43.图3.3,2态:识别标识符和关键字,4态:识别整常数,8态:识别*,9态:识别*,13态:识别错误,5态:识别=,6态:识别+,42,状态转换图容易用程序实现:即容易由转换图编写词法分析程序。最简单的办法是让每个状态结点对应一小段程序。根据画出的识别单词的状态转换图构造词法分析程序,每个状态对应一段程序,完成到达此状态的工作;词法分析程序的控制程序模拟状态转换图的状态转换。,3.2.4 状态转换图的实现(自学),43,状态转换图实质上就是一个抽象的程序流程图。转换图忽略了程序的实现细节,着力刻画了单词符号识别的本质。转换图与程序结构之间存在下述对应关系,并可以据此构造
23、相应的程序:初态对应程序的开始;终态对应程序的结束,一般是一条返回语句,且不同的终态对应不同的返回语句;状态转移分叉对应分情况或者条件语句;转换图中的环对应程序中的循环语句;,3.2.4 状态转换图的实现,44,3.2.4 状态转换图的实现,为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1)Ch 字符变量存放刚读入的源程序字符;2)Token 单词字符串存放构成单词的字符串;3)Getchar 读一个字符到 Ch中子程序;4)GetBC 读一个非空白字符到Ch中子程序;5)Concat 把Ch中字符连接到Token 之后子程序;6)isLetter 判
24、断Ch中字符是否为字母子程序;7)isDigit 判断Ch中字符是否为数字子程序;8)Reserve 用Token中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字子程序;9)Retract 把Ch中字符回送到缓冲区子程序;,45,状态结对应程序段的编写(1),不含回路的分叉结对应条件语句或情形语句,状态结 i 对应的程序段:Getchar();If(IsLetter()状态j的对应程 序段;Else if(IsDigit()状态k的对 应程序段;Else if(ch=/)状态l的对应程 序段;Else 错误处理程序段 或接其他状态图的程序;,46,状态结对应程序段的编写(2),
25、含回路的状态结 对应循环语句,状态结 i 对应的程序段:Getchar();While(IsLetter()or IsDigit()Begin concat();Getchar();End;状态j的对应程序段;,47,状态结对应程序段的编写(3),终态结(如图3.3中的状态5、6、9、10、11、12、13)对应return(Code,Value)语句,返回单词符号的内部表示二元式给语法分析器。带*号的终态结(如图3.3中的状态2、4、8)多读进了一个不属于现行单词符号的字符,这个字符应退回,即搜索指示器要回调一个字符位置,这时除了Return外,还要调用Retract过程来完成这项工作。,4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 编译 原理 陈火旺
链接地址:https://www.31ppt.com/p-6607495.html