收藏 分享(赏)

编译原理教案27050.doc

上传人:dreamzhangning 文档编号:2728154 上传时间:2018-09-26 格式:DOC 页数:92 大小:2.88MB
下载 相关 举报
编译原理教案27050.doc_第1页
第1页 / 共92页
编译原理教案27050.doc_第2页
第2页 / 共92页
编译原理教案27050.doc_第3页
第3页 / 共92页
编译原理教案27050.doc_第4页
第4页 / 共92页
编译原理教案27050.doc_第5页
第5页 / 共92页
点击查看更多>>
资源描述

1、课程编码:07153008编译原理及实现技术 课程教案20112012 学年第 1 学期任课教师:郭德贵、张红、张睿吉林大学计算机科学与技术学院课程名称:编译原理课程英文名称:Compiler Principle学时:64学分:4授课对象:计算机科学与技术 专业 2009 级 教学目的:编译原理课程是计算机科学与技术专业学生的专业骨干课之一。通过学习这门课程,使学生掌握编译程序的基本原理、方法和实现技术,使学生更好的理解程序语言的内部机制,培养学生初步掌握设计大型系统软件的方法、技术以及设计大型软件的能力。教学方式: 板书 多媒体 系统演示教材:刘磊 编译原理及实现技术 机械工业出版社 200

2、5教学参考书:1)陈火旺等 程序设计语言编译原理 国防工业出版社 20012)吕映芝,张素琴,蒋维杜 编译原理 清华大学出版社 19983) Alfred V.Aho,Ravi,Sethi,Jeffrey D.Ullman. Compilers: Principles, Techniques, and Tool. Addison Wesley, 1985.4)Charles N.Fischer, Richard J.LeBlanc. Crafting a Compiler with C. Pearson Education, 1991授课题目 第一章 编译引论授课学时 2 授课时间教学重点、难

3、点:本章从总体上概要介绍编译相关的原理和技术以及典型编译器的逻辑结构,使学生对编译程序有一个初步的认识。本章重点和难点为各基本概念的理解和对整个编译程序各个阶段所承担任务的理解和掌握。教学要点: 本章需要学生掌握如下内容:1 实现高级语言的编译方式和解释方式及其区别。编译方式:对整个源程序进行分析,翻译成等价的目标程序,翻译的同时做语法检查和语义检查。然后再运行目标程序。解释方式:一个语句一个语句的读入源程序,边翻译边执行,在翻译过程中不产生目标程序。解释方式特别适合于交互式语言;而且解释方式允许程序执行时改变自身,比如调试程序。这种情形编译程序不易胜任,因为它需要动态编译,而解释程序可以毫无

4、困难的胜任;此外,解释程序不依赖于目标机,因为它不生成目标代码,可移植性优于编译程序。但是和编译程序相比,解释程序开销大,运行速度慢得多。解释方式和编译方式的最根本区别在于:在解释方式下,并不生成目标代码程序,而是直接执行源程序本身。 2 典型编译器的各个组成部分以及各个部分所承担的任务。a. 词法分析阶段词法分析的任务是扫描源程序的 ASCII 码序列,识别出一个个具有独立意义的最小语法单位,即单词.b. 语法分析阶段语法分析的任务是根据程序设计语言的语法规则,把词法分析的结果分解成各种语法单位,同时检查程序中的语法错误。c. 语义分析阶段这一阶段的任务是对语法分析所识别出的各类语法范畴,分

5、析其含义,并进行静态语义检查。d. 中间代码生成在进行了上述的语法分析和语义分析阶段的工作后,编译程序将源程序变成一种内部表示形式.e. 中间代码优化此阶段的任务是对前阶段产生的中间代码在不改变源程序语义的前提下进行加工变换,使生成的代码更为高效,缩短运行时间或节省存储空间。f. 目标代码生成这一阶段的任务是把中间代码变换成特定机器上的机器指令代码或汇编指令代码。g. 表格管理编译程序在对源程序的分析过程中,需要创建和管理一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况。3 遍 具体实现上,受不同源语言、设计要求和计算机硬件条件的限制,往往将编译程序组织成若干遍(Pass) 。所谓“

6、遍”就是对源程序或源程序的中间表示形式从头到尾扫描一次,并作加工处理,生成新的中间结果或目标程序。既可以将编译过程中的几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。例如,词法分析这一阶段可以作为单独的一遍,但更多的时候是把词法分析程序作为语法分析程序的子程序来加以调用,将词法分析阶段和语法分析阶段合并为一遍。4 前端和后端 概念上,我们有时把编译程序划分为编译前端和编译后端。前端主要由与源语言有关但与目标机无关的那些部分组成。编译前端通常包括词法分析、语法分析、语义分析、中间代码生成,与目标机无关的中间代码优化部分也可包含在前端,当然前端也包括相应部分的错误处理。编译后端包括与目标机

7、有关的中间代码优化部分和目标代码生成等。一般来说,这些部分与源语言无关而仅仅依赖于中间语言。很明显编译后端是面向目标语言的,而编译前端则不是,它几乎独立于目标语言。5 编译程序的实现一般开发编译程序有如下几种可能途径:a. 转换法(预处理法):假如我们要实现 L 语言的编译器,现在有 L语言的编译器,那么可以把 L 语言程序转换成 L语言的程序,再利用 L语言的编译器实现 L 语言,这种方法通常用于语言的扩充。如对于 C+语言,可以把C+程序转换成 C 程序,再应用 C 语言的编译器进行编译,而不用重新设计和实现 C+编译器。常见的宏定义和宏扩展都属于这种情形。b. 移植法:假设在 A 机器上

8、已有 L 语言的编译程序,想在 B 机器上开发一个 L 语言的编译程序。这里有两种实现方法:实现方法一:最直接的办法就是将 A 机的代码直接转换成 B 机代码。实现方法二:假设 A 机和 B 机上都有高级程序设计语言 W 的编译程序,并且 A 机上的 L 语言编译程序是用 W 语言写的,我们可以修改 L 编译程序的后端,即把从中间代码生成 A 机目标代码部分改为生成 B 机的目标代码。这种在 A 机上产生 B 机目标代码的编译程序称为交叉编译程序(Cross Compiler) 。c. 自展法:实现思想:先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言

9、,实现源语言的编译程序。通常这个过程会分成若干步,像滚雪球一样直到生成预计源语言的编译程序为止。我们把这样的实现方式称为自展技术。使用自展技术开发编译器要求这种高级语言必须是能够编译自身的。d. 工具法:70 年代随着诸多种类的高级程序设计语言的出现和软件开发自动化技术的提高,编译程序的构造工具陆续诞生,如 70 年代 Bell 试验室推出的 LEX,YACC 至今还在广泛使用。其中 LEX 是词法分析器的自动生成工具,YACC 是语法分析器的自动生成工具。然而,这些工具大都是用于编译器的前端,即与目标机有关的代码生成和代码优化部分由于对语义和目标机形式化描述方面还存在困难,虽有不少生成工具被

10、研制,但还没有广泛应用。e. 自动生成法:如果能根据对编译程序的描述,由计算机自动生成编译程序,是最理想的方法,但需要对语言的语法、语义有较好的形式化描述工具,才能自动生成高质量的编译程序。目前,语法分析的自动生成工具比较成熟,如前面提到的 YACC 等,但是整个编译程序的自动生成技术还不是很成熟,虽然有基于属性文法的编译程序自动生成器和基于指称语义的编译程序自动生成器,但产生目标程序的效率很低,离实用尚有一段距离,因此,要想真正的实现自动化,必须建立形式化描述理论。授课题目 第二章 语言和文法授课学时 1 授课时间教学重点、难点:文法的定义和分类;短语和句柄;语法树和文法二义性 教学要点:1

11、 基本概念:定义 1 字母表字母表(alphabet)是元素的非空有穷集合 ,字母表中的一个元素称为该字母表的一个字母(letter),也可叫做符号(symbol)或者字符(character). 定义 2 符号串由字母表中的符号组成的任何有穷序列称为符号串。定义 3 符号串的连接设 x 和 y 均是字母表上的符号串,它们的连接是把 y 的所有符号顺序接在 x 的符号之后所得到的符号串。定义 4 符号串的方幂设 x 是字母表上的符号串,把 x 自身连接 n 次得到的符号串 z, 即 z=xxxx(n 个 x),称作符号串 x 的 n 次幂,记作 z=x n。 根据定义有:x0 =x1=x x2

12、=xxx3=x2x=xx2=xxxxn=xn-1x=xxn-1=xxxx(n 个 x)例 1: 设 x=001,则有 x 0= x 2=001001 , x3=001001001。定义 5 前缀和后缀设 x 是某一字母表上的符号串,x=yz ,则 y 是 x 的前缀,z 是 x 的后缀,特别是当z 时, y 是 x 的真前缀;y 时,z 是 x 的真后缀。例 2 设 x=abc ,则 ,a , ab , abc 都是 x 的前缀,其中 ,a , ab 为 x 的真前缀;而 abc , bc , c , 都是 x 的后缀,其中 bc , c , 为 x 的真后缀。定义 6 子字符串一个非空字符串

13、 x ,删去它的前缀和后缀后所得到的字符串称为 x 的子字符串,简称子串。如果删去的前缀和后缀不同时为 ,则称该子串为真子串。定义 7 符号串集合若集合 A 中的所有元素都是某字母表上的符号串,则称 A 为该字母表上的符号串集合。定义 8 符号串集合的乘积设 A、B 是两个符号串集合,AB 表示 A 与 B 的乘积,则定义 AB=xy|(xA)(yB) , 运算结果仍然表示符号串的集合。 例 3 设 A= a, bc , B=de, f ,则 AB=ade, af, bcde, bcf 注意有A=A= A , A=a=,其中为空集。符号串集合的乘积一般不满足交换律。定义 9 符号串集合的方幂设

14、 A 是符号串集合,则称 Ai 是符号串集合 A 的方幂,其中 i 是非负整数。具体定义如下:A0= A1=AA2=AAAn=AA A (n 个 A)定义 10 符号串集合的正闭包设 A 是符号串集合,则称 A+为符号串集合 A 的正闭包。其具体定义如下:A+=A1 A2 A3 定义 11 符号串集合的星闭包:设 A 是符号串集合,则称 A+为符号串集合 A 的星闭包。其具体定义如下:A* = A0 A1 A2 A3 星闭包又称自反闭包或克林闭包。 由定义显然有 A+ =A A*。例 4 设 A=ab, cd,则 A+= ab, cd, abab, abcd, cdab, cdcd, abab

15、ab, ababcd, A* = , ab, cd, abab, abcd, cdab, cdcd, ababab, ababcd, 定义 12 文法(grammar )一个文法 G 是一个四元组 G=(VN,VT, S, P ) 其中:VT 是一个非空的有限集合,它的每个元素称为终极符号或终极符,一般用小写字母表示。 从语法分析的角度看,终极符号是一个语言不可再分的基本符号。 VN 是一个非空的有限集合,它的每个元素称为非终极符号或非终极符,一般用大写字母表示。非终极符是一个语法范畴,表示一类具有某种性质的符号,它不出现在句子中。设 V 是文法 G 的符号集,则有 V= VN VT , VN

16、 VT = ,即 VN 和 VT 的交集为空。S 是一个特殊的非终极符号,称为文法的开始符号。S VN。P 是产生式的有限集合。所谓的产生式,也称为产生规则或简称为规则,是按照一定格式书写的定义语法范畴的文法规则。2文法分类一个文法的核心是产生式集合,它决定了文法所产生的语言。根据产生式所受的限制不同,乔姆斯基将文法分为四类,四类文法对应四种类型的语言,通常称之为乔姆斯基体系。a. 0 型文法(短语型文法)如果对文法 G 中的任一产生式 不加任何限制,则称 G 为 0 型文法或短语型文法。其中,、 是符号串。b. 1 型文法(上下文相关文法)如果对文法 G 中的任一产生式均限制为形如:A 其中

17、 AV N ,(V TV N)*, (V TV N)+,则称文法 G 为 1 型文法或上下文相关文法。c. 2 型文法(又称上下文无关文法)如果对文法 G 中的任一产生式均限制为形如:A 其中 AV N , (V TV N)* 则称 G 为 2 型文法或上下文无关文法。 在 2 型文法中,用取代非终极符 A 时,与 A 所在的上下文无关,所以称之为上下文无关文法。例 2.5 文法 G: SaSb | ab容易验证,G 为 2 型文法,G 产生的语言为:L(G)=anbn|n1例 2.6 文法 G: SaPd | abcdPbPc | bc容易验证,G 为 2 型文法,G 产生的语言为:L(G)

18、=anbmcmdn|m,n1 d. 3 型文法(又称线性文法、正则文法、正规文法)如果对文法 G 中的任一产生式均限制为形如: AB 或 A 其中A,BV N , V T 则称文法 G 为 3 型文法。上述形式的 3 型文法也称为右线性文法,3 型文法还有另一种形式,称为左线性文法。 如果对文法 G 中的任一产生式均限制为形如: AB 或 A 其中A,BV N, V T这样的 3 型文法称为左线性文法。例 2.8 文法 G: SS0 | 03 短语和句柄:定义 13 短语 设 G 是一部文法,S 是 G 的开始符号,是文法 G 的一个句型,如果有:S *A并且 A +则称是句型的相对于非终极符

19、 A 的短语。定义 14 直接短语(简单短语)设 G 是一部文法,S 是 G 的开始符号,是文法 G 的一个句型,如果有:S *A并且 A 则称是句型的相对于非终极符 A 的直接短语。直接短语也称为简单短语。定义 15 句柄一个句型的最左直接短语称为句柄。例 9 设有文法 G: S cAd A ab|a对于符号串$=cabd ,显然存在推导 S cAd cabd .则 ab 是句型 cabd 相对于 A 的短语,也是相对于 A 的直接短语;同时 ab 也是句型 cabd 的句柄。授课题目 第二章 语法树和文法二义性授课学时 1 授课时间教学重点、难点:用语法树表示推导文法二义性教学要点:1语法

20、树与文法二义性定义 语法树设 G 是给定的文法,称满足下列条件的树为 G 的一棵语法树。a. 每个节点都标有 G 的一个文法符号,且根节点标有初始符 S,非叶节点标有非终极符。b. 如果一个非叶节点 A 有 n 个儿子节点 B1,B2,Bn(按从左到右顺序) ,则AB1B2Bn 一定是 G 的一个产生式。语法树是推导过程的图形表示,这种表示方式有助于理解一个句子语法结构的层次。在推导的过程中,当某个非终极符被它的某个候选式所替代时,这个非终极符的相应节点就产生出下一代的节点,候选式中每个符号依次对应地标记了新产生的节点,每个新节点和父节点之间都有线段相连接。在一棵语法树生长的任何时刻,所有那些

21、叶节点上所标记的符号按照从左到右的次序排列起来就是这个文法的一个句型,树的生长过程就是这个句型的推导过程。例如,对于表达式文法 G: EE+E|E*E|(E)|i ,符号串 i+i*i 显然是此文法的合法句型,这个句型的最左推导过程是:E E+E i+E i+E*E i+i*E i+i*i这是句型 i+i*i 的最左推导序列,这个推导过程的每一步均可用语法树表示,如图 2.1 所示。EEE+(a) EEi+(b) EEi+(c)EE*EEi+(d)iE*EEi+(e)ii*句型 i+i*i 最左推导过程的语法树表示对于句型 i+i*I,还可以使用最右推导或既非最左又非最右的推导,同样可以给出其

22、推导过程并用语法树表示。对比这些结果可以发现,如果推导方式不同,得到的推导序列就不同,语法树的生长过程也不同。也就是说,一棵语法树包含了一个句型的多种可能的推导过程,包括最左和最右推导,从语法树本身看不出推导的次序。这样的一棵语法树是这些不同推导过程的共性抽象。那么如果使用一种确定的推导方式,比如最左推导(或最右推导) ,一个句型的最左推导是否一定唯一呢?也就是这个句型所对应的语法树是否只有唯一的一棵呢?对于上面提到的表达式文法,它的句型 i+i*i 就存在另一种完全不同的最左推导:E E*E E+E*E i+E*E i+i*E i+i*i 这个最左推导所对应的语法树如图 2.2 所示。EEE

23、* EEE*EE+ EEE*iE+EEE*ii+ EiE*ii+(a) (b) (c)(d)(e)2文法二义性 定义 文法二义性对一个文法 G,如果至少存在一个句子,有两棵(或两棵以上)不同的语法树,则称该句子是二义性的。包含有二义性句子的文法称为二义性文法,否则,该文法是无二义性的。根据定义 2.20 和上面的讨论,句子 i+i*i 存在两个不同的最左推导,显然它是二义性的,因此表达式文法 G: EE+E|E*E|(E)|i 是二义性文法。值得指出的是,文法的二义性和语言的二义性是两个完全不同的概念。并非由于文法的二义性,语言就有二义性。可以有两个文法 G 和 G ,一个有二义性,另一个没有

24、二义性,但却有 L(G)=L(G), 即这两个文法是等价的,它们所产生的语言相同。因此,我们在实际应用中,可以对文法进行等价变换,以消除文法中的二义性。例如表达式文法 G: EE+E|E*E|(E)|i ,可以通过人为规定 “*”的优先级高于“+”的优先级,并且都遵从左结合,就可以构造出与之等价的无二义性文法 G:授课题目 第二章 文法的等价变换授课学时 授课时间教学重点、难点:直接左递归和间接左递归的消除;空产生式消除; 教学要点:拓广变换 在 LR 类语法分析中,为了便于控制分析过程的结束,通常要求文法具有唯一的开始符并且开始符不出现于产生式的右部。如果原文法不满足该条件,需要 对原文法进

25、行等价变换,因此,我们引入如下定理:定理 2.1 对任一文法 G1 都可以构造文法 G2,使得 L(G1)=L(G2),且 G2 有这样的特点,即 文法的开始符唯一并且不出现于任何产生式的右部。证明:假设 S 是 G1 的开始符,则只要在 G1 中扩充一条新产生式 ZS 即可,其中 Z 是新 的开始符。另这样扩充后的文法为 G2,则它显然满足定理的要求。去空产生式:定理 2.2 对于任一文法 G1( L(G1)) ,可构造文法 G2,使得 L(G1)=L(G2),并且 G2 中无 空产生式。证明:根据 G1,构造 G2 的方法如下:(1) 令=A | A,即表示文法 G1 中所有右部为 的产生

26、式的左部非终极符。(2) 递归扩充直到收敛为止,即= A | A +, +。(3) 从 G1 中删除所有空产生式。(4) 从 G1 中删除只能导出空串的非终极符。(5) 对于文法中任意产生式 AX1X2Xi-1XiXi+1Xn,X i (i=1,2,n)有三种情况: 若 XiVT,不做动作; 若 XiVT-,不做动作; 若 Xi,补充规则 A X1X2Xi-1Xi+1Xn;重复这个过程,直到不出现新的产生式为止。例 设有如下文法AaBcDBb | DBB | d消除该文法中的空产生式。解:=B, D,根据算法中第 3 步可以增加下列产生式AacDAaBcAacAB去掉文法中的空产生式 B,得到

27、新的文法如下AaBcD | acD | aBc | acBbDBB | B | d消除不可达产生式:定理 2.3 对任一文法 G1 都可以构造文法 G2,使得 L(G1)=L(G2),并且 G2 中的每个非终极 符必出现在它的某个句型中。证明:根据 G1,构造文法 G2 的方法如下:(1) 令=Z | Z 是文法的开始符。(2) 递归扩充直到收敛为止,即= B | AxByG1, BVN, A。(3) 若一个产生式左部非终极符 A,则删除以 A 为左部的所有产生式。4去公共前缀:公共前缀表示 A 的不同产生式的右部具有相同的前缀,这种情形不满足自顶向下的语法分 析条件。这时可用提取左因子的方法

28、消除产生式的公共前缀。假定关于的规则是:A1|2|n| 1| 2 | m (其中每个 不以开头)那么,可以把这些规则写成AA|1|2| mA1|2|n经过反复提取左因子,就能够把每个非终极符所有产生式的首符集变成两两不相交。例 2.7 在 Pascal 语言中,语句和表达式的产生式都有公共前缀:Stmid := ExpStmid(ExpL)ExpLExpExpLExp, ExpL其中第二个产生式表示过程调用语句。这时可通过提取左因子法消除公共前缀得到下面产 生式:Stmid StmStm:= ExpStm(ExpL)ExpLExp ExpLExpL, Exp ExpLExpL5消除递归:如果文

29、法中的某个非终极符 A 有推导 A +A,则称 A 左递归。左递归 情形,一定使得自顶向下的语法分析分析条件不成立。首先考虑直接的左递归,下 面是其中一例:AA | A 消除产生式中的直接左递归是比较容易的。一般情形,假定有产生式:AA1| A2| An|1|2|n其中,每个都不等于,每个都不以 A 开头,那么有下面的产生式:AA( 1| 2| n)| (1|2|n)若令= 1| 2| n,= 1|2|n,则可简化成下面产生式AA | 即有 A(至少有一个 ) 。显然它可以用下面产生式定义AAAA | 再把和分别替换成 1| 2| n 和 1|2|n,则可得下面的产生式A(1|2|n)AA(

30、1| 2| n)A | 使用这个办法,我们容易把文法中所有直接左递归都消除掉,但这并不意味着已经 消除整个文法的左递归性。例 考虑下面文法:SQc | cQRb | bRSa | a虽不具有直接左递归,但 S、Q、R 都是左递归的,例如有S Qc Rbc Sabc如何消除一个文法的一切左递归呢?消除一般左递归的主要思想是切断环路。以防 止左递归。如果一个文法不含回路(形如 P *P 的推导) ,也不含以为右部的产 生式,那么,消除左递归的算法如下:(1)把文法 G 的所有非终极符按任意一种顺序排列成 P1,P2Pn;按此顺序执行;(2)FOR i:=1 TO n DOBEGINFOR j:=1

31、 TO i-1 DO把形如 PiPj 的规则改写成Pi1|2|k,其中 Pj1|2|k 是关于 Pj 的所有规则;消除关于 Pi 规则的直接左递归;END(3)化简由(2)所得的文法。即消除那些不可到达的非终极符的产生式规则。例如,考虑例 4.5 的文法,令它的非终极符的排序为 R、Q、S。对于 R,不存在直 接左递归。把 R 代入到 Q 的有关产生式后,我们把 Q 的规则变为QSab | ab | b现在的 Q 同样不含直接左递归,把它代入到 S 的有关产生式后,S 变成SSabc | abc | bc | c经消除 S 的直接左递归后,我们得到整个文法为SabcS | bcS | cSSa

32、bcS | QSab | ab | bRSa | a显然,其中关于 Q 和 R 的规则是多余的。经化简后所得的文法是:SabcS | bcS | cSSabcS | 注意,由于对非终极符排列顺序的不同,最后所得的文法在形式上可能不一样。但不难证 明,它们都是等价的。例如,若对上面文法的非终极符排序为 S、Q、R,那么,最后所得 的无左递归的文法是:SQc | cQRb | bRbcaR | caR | aRRbcaR | 显然,两个文法是等价的。授课题目 第二章 有限自动机授课学时 授课时间教学重点、难点:1 确定有限自动机2 非确定有限自动机3 非确定有限自动机确定化教学要点:确定有限自动机

33、(FA)一个确定有限自动机 M 是一个五元组:M=(S , ,f ,S 0,Z) ,其中:S:是一个有限集合,它的每个元素称为一个状态。:是一个有穷字母表,它的每个元素称为一个输入字符。f:是状态转换函数,它是一个从 S 到 S 的单值全映射。 F(S,a)=S 意味着:当 前状态为 S 输入字符为 a 时,自动机将转换到下一状态 S。我们称 S为 S 的一个后 继状态。S0:S 0 S, 是确定有限自动机唯一的初始状态(也称为开始状态) 。Z:Z S,是终止状态(也称为接受状态)集合。例 设有 DFA M=(0,1,2,3 ,a,b,c,f,0,3)其中 f 定义为:f(0,a) = 1 f

34、(0,b) = 4 f(1,a) = 4 f(1,b) = 2 f(2,a) = 3 f(2,b) = 4 f(3,a) = 3 f(3,b) = 3 f(4,a) = 4 f(4,b) = 4 此 DFA 对应的状态转换图如图所示。 301 2a b aa ,b4baba,bS a b0 1 41 4 22 3 43* 3 34 4 4非确定有限自动机:定义 非确定有限自动机一个非确定有限自动机 M 是一个五元组 M=(S , ,f ,S 0,Z),其中:S:是一个有限集合,它的每个元素称为一个状态。:是一个有穷字母表,它的每个元素称为一个输入字符。f:是状态转换函数,它是一个从 S* 到

35、S 的子集的映射,即 S* 2s .注意这里的后继状态不是单一的一个状态,它是状态集 S 的子集。S0: S0S , 是非空初态集。Z: Z S ,是终止状态集。 对于非确定有限自动机,同样也可以用状态转换图和状态转换矩阵来表示。例 设有 NFA M = (0,1,2 ,a,b,f,0,2 )其中 f 定义为:f(0,a)=0,1 f(0,b)=0f(1,a)= f(1,b)=2f(2,a)=2 f(2,b)=2此 NFA 对应的状态转换图如图 2.6 所示。0 21a,ba ba,b图 2.6 NFA M 的状态转换图此 NFA 对应的状态转换矩阵如图所示。NFA M 的状态转换矩阵非确定有

36、限自动机和确定有限自动机的等价性。对任何一个 NFA M,都存在一个 DFA M , 使得 L(M)=L(M) 首先定义两个闭包:1. 设 I 是 NFA M 的状态集的子集,定义 I 的闭包_CLOSURE(I)为:a. 若 q I ,则 q _CLOSURE(I)b. 若 q I,那么从 q 出发经任意条 弧而能到达的任何状态 q都属于 _CLOSURE(I)。2. 设 I 是 NFA M 的状态集的子集,a,可以定义状态子集 IaS,对任一 sjI a,必有 siI ,使得 si 和 sj 之间存在一条由 si 指向 sj 的有向弧,弧上的标记字符恰为 a。Ia=_CLOSURE(J)其

37、中,J 是那些可从 I 中的某一状态节点出发经过一条 a 弧而能到达的状态节点的全体。然后对给定的 NFA 按照如下的步骤进行确定化:(1) 构造一张表,共有| |+1 列,第一列为状态子集 I,然后对每个 a分别设一列 Ia;(2) 第一行第一列的状态子集为 I 为_CLOSURE(s 0),其中 s0 为初始状态;S a B0 0,1 01 22* 2 2(3) 为第一列中的 I 和每个 k求 Ik,并记入相应的 Ik 列。如果它和表格第一列中的所有状态子集均不相同,则此表生成一个新行,将它填入新行的第一列中。(4) 重复步骤(3) ,直到对每个 I 和 k均已求得 Ik,且不再生成新的状

38、态子集为止。此过程在有限步内一定可以终止,因为如果|S|=n,则状态子集最多只有 2n 个,上述表最多只有 2n 行;(5 ) 将第一列中的每个状态子集重命名为新的状态,则上述表格便成为新的状态状换矩阵。例 设有 NFA M =( 1 , 2, 9 , a , b , f , 1, 6 , 7 , 9 ) 其中 f 如图 2.8 所示.1 524 637 8 9a a bb baNFA M 的状态转换图 对此 NFA ,我们首先构造一张表,表的每一行含有 |+1 列。将表的第二行的第一列处单元格的值置为 _CLOSURE(s0),这里为 _CLOSURE(1)=1 , 2。然后我们开始计算表中

39、其它单元格的值。一般而言,如果某一行的第一列中的状态子集已经确定,记为 I,那么对 k求 Ik,并记入这一行相应的 Ik 列。然后我们检查这一行所有的状态子集 Ik,看它们是否已经在表的第一列中出现过,如果某一个 Ik 没有出现过,则在此表的最下面生成一个新行,将它填入新行的第一列中。 重复上述的过程,直至所有已生成的 Ik 均已在表的第一列中出现过。这种 NFA 确定化的方法称为子集法。按照子集法 NFA M 进行确定化构造出的状态转换矩阵表如图所示。I Ia Ib1,2 2,4,5,6,7 3,82,4,5,6,7 3,9,83,8 9 3,9,8 9 9 对 NFA M 进行确定化构造出

40、的状态转换矩阵表对表格的状态子集进行重命名,分别用 1、2、3、4、5 来代表1,2、2,4,5,6,7 、3,8、3,9,8 、9这五个状态子集,形成如图 2.10 所示的状态转换矩阵,它即是和 NFA M 等价的 DFA M。I A b1 2 32* 43 54* 55*和 NFA M 等价的 DFA M 授课题目 第二章 正则表达式授课学时 授课时间教学重点、难点:正则表达式和正则集; 正则表达式和有限自动机相互转化; 教学要点:正则表达式和正则集设为有限字母表,在上的正则表达式和正则集可递归定义如下:(1) 和 是上的正则表达式,它们表示的正则集分别为 和;(2) 对任何 a,a 是上

41、的正则表达式,它所表示的正则集为a;(3) 若 r,s 都是正则表达式,它们表示的正则集分别为 R 和 S, 则(r|s) 、(r s)、 (r )*也是正则表达式,它们分别表示的正则集是:RS , RS 和 R*。(4) 有限次使用上述三条规则构成的表达式,称为上的正则表达式,仅由这些正则表达式表示的集 合称为正则集。正则表达式的运算符“|”读作“或” , “”读作“连接” , “*”读作“闭包” (即任意有限次的自 重复连接) 。在不至于引起混淆时,正则表达式中的括号可以省略不写,连接符“ ”一般也可 以省略不写,但规定算符的优先顺序为:先“*” ,次“” ,最后“| ”,且规定它们的结合

42、性为左 结合。定理 2.6对上的每一个正则表达 r,存在一个上的非确定有限自动机 M,使得 L(M) = L(r) 。 证明:1. 对于字母表上的任意一个正则表达式 R,一定可以构造出一个非确定有限自动机 M, 使得L(M)=L(R)。首先构造此非确定有限自动机 M 的初始状态转换图,其中只有开始状态 S 和终止状态 Z,由 S 射出指向 Z 的有向弧上标记正则表达式 R,然后按照图 2.13 所示的替换规则对正则表达式 R 依次进行分解,分解过程中不断加入新的状态节点和有向弧,直至状态转换图中所有有向弧上标记的符号都是字母表上的元素或 为止。 A CBR12 A BR1 R2替 换 为(1)

43、A BR1| 2 A BR2替 换 为(2) R1A B CR1* A BR1替 换 为(3)转换规则 1例 有正规表达式(a|b)*aa,为之构造等价的 NFA。构造过程如图所示 0 1 2a 9Zab(a|b)*(b) a0 9Z(a|b)*a(a)0 1 2a 9Z(c) a4 a|b0 1 2a 9Z(d) a4由正则表达式构造等价 NFA2. 同样,对于字母表上的非确定有限自动机 M,也可以在上构造相应的正则表达式 R,使得L(R) = L(M)。首先,对非确定有限自动机 M 的状态转换图进行拓广,即令每条弧可以用一个正则表达式标记。然后在 M 的状态转换图中加入两个节点,一个是唯一

44、的开始状态节点 S,另一个是唯一的终止状态节点 Z 。从 S 出发用标有 的有向弧连接到 M 的所有初始状态节点上,从 M 的所有终止状态节点用标有 的有向弧连接到 Z 节点,形成一个与 M 等价的 M.接着,对 M按照图 2.15 所示的替换规则进行替换,也就是不断消去原有的节点和有向弧,当状态转换图中只剩下节点 S 和 Z 时,在 S 指向 Z 的有向弧上所标记正则表达式就是所求的结果。 AC BR12A BR1 R2 替 换 为(1)A BR1| 2A BR2 替 换 为(2) R1A BC R1*A BR1 替 换 为(3)转换规则 2例 有如图 2.16 所示的 NFA M,试构造与

45、之等价的正则表达式 r。1 32 4 5 6a a ab b abNFA M 先对 NFA 的状态转换图进行拓广,然后按照图所示的转换规则,逐步消去自动机中的节点和弧,直至状态转换图中只剩下开始状态 S 和接受状态 Z 为止,此时 S 和 Z 之间弧上标记的正则表达式即为所求。转换过程如图所示。 1 324 5 6a a ab bab(a)S Z 12 5 6a ab(b)S Z abba12 5 6a ab(c)S Z ab|1 6(d)S Z a(b|a)*b(e)S Za(b|a)*b作业安排:课后作业:4,6,8(1、3授课题目 第三章 词法分析程序的设计授课学时 1 学时 授课时间教

46、学重点、难点: 词法分析程序的两种接口形式; 单词分类及其内部表示形式; 单词的形式化描述; 自动机的实现方法。教学要点: 3.1 词法分析介绍 功能 读源程序的字符序列,逐个拼出单词,并构造相应的内部表示 TOKEN.同时检查源程序中的词法错误. 单词 所谓单词是指语言中具有独立含义的最小的语义单位。 Token 单词的内部表示。编译程序总是用某种程序语言书写的程序,语言的操作对象只能是该语言规定的各种数据。而编译程序的操作对象是程序中的各种语法单位,因此,必须把它们表示成某种数据结构形式。 词法分析程序接口 词 法 分 析 语 法 分 析源 程 序 TokenList词 法 分 析 语 法

47、 分 析Token源 程 序 Cal3.2 词法分析程序的设计 单词分类 一般常用程序设计语言的单词可以分为以下几类1. 保留字:保留字一般是由语言系统自身定义的,通常是由字母组成的字符串。2. 标识符:标识符一般是由字母开头,字母、数字或其它符号的任意组合构成的。3. 常量:用来表示各种常量。主要包括整数常数、实数常数、字符串常量等。4. 特殊符号:包括运算符和界限符。运算符表示程序中算术运算、逻辑运算、字符运算、赋值运算的确定的字符或字符串。 单词内部表示单词的内部表示 TOKEN 的结构一般由两部分组成:单词类别和语义信息。单词类别用来区分单词的不同种类,通常可以用整数编码来表示。单词的语义信息也取决于今后处理上的方便。对于常量和标识符还可以单独构造常量表和标识符名字表,此时,单词的语义信息的值就是指向常量表或标识符名字表中相应位置的指针。 单词的形式化描述(正则表达式描述)描述程序设计语言中单词的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报