编译原理 第03章 词法分析与有穷自动机.ppt
《编译原理 第03章 词法分析与有穷自动机.ppt》由会员分享,可在线阅读,更多相关《编译原理 第03章 词法分析与有穷自动机.ppt(139页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第三章 词法分析与有穷自动机 词法分析程序功能 词法分析程序的编写方法 正规文法与有穷自动机 正规式与有穷自动机正规式与有穷自动机 语言单词符号的两种定义方式 单词符号及输出单词的形式 回顾回顾:词法分析的任务字符串表示的源程序词法分析器字符单词符号取下一个单词符号语法分析器 3.1 词法分析程序的功能 3.2 单词符号及输出单词的形式 关键字 也称基本字,例如,C语言中 的if,else,while,do等。标识符 表示各种名字,如变量名、常 量名、数组名和函数名等。语言的单词符号是指语言中具有独立语言的单词符号是指语言中具有独立 意义的最小语法单位意义的最小语法单位。3.2 单词符号及输
2、出单词的形式 常数 整型常数125、实型常数0.718、布尔型常数TRUE等。运算符 如、*、/、等。分界符 如,、;、(、)、:等。3.2 单词符号及输出单词的形式 词法分析程序所输出的单词符号通常表示成如下的二元式:(单词种别,单词自身的值)(单词种别,单词自身的值)单词种别:单词种别:单词的种类 3.2 单词符号及输出单词的形式 常数:可统归为一种,也可按类型 (整型、实型、布尔型等)划分。关键字:可全体视为一种,也可一字一种。标识符:一般统归为一种。运算符和界符:可一符一种类,也可统归为一种。3.2 单词符号及输出单词的形式 单词自身的值单词自身的值 一个种别只含一个单词符号 一个种别
3、含有多个单词符号 (1)对于标识符其自身值是标识符自 身的字符串;(2)常数自身值是常数本身的二进制 数值。3.2 单词符号及输出单词的形式 (3)用指向某类表格一个特定项目指 针值来区分同类中不同的单词。例如,对于标识符用它在符号表的入口指针作为它自身值;常数用它在常数表的入口指针作为它自身的值。3.2 单词符号及输出单词的形式 常数自身的值用常数本身的值表示;例如:if (a1)b=100;假定:关键字、运算符和界符都是一符一种;标识符自身的值用自身的字符串表示;3.2 单词符号及输出单词的形式 假设:标识符的种别编码为整数10;常数的种别编码为整数11;基本字if种别编码为2;赋值号的种
4、别编码为17;大于号的种别编码为23;分号的种别编码为26;左括号的种别编码为29;右括号的种别编码为30;则程序段:3.2 单词符号及输出单词的形式 if (a1)b=100;经词法分析后,输出的单词符号串是:(2,)基本字if(29,)左括号((10,a)标识符a(23,)大于号(11,1)常数 1(30,)右括号)(10,b)标识符b(17,)赋值号=(11,100)常数 100(26,)分号 ;3.3 单词符号的两种定义方式正规式 以标识符为例:Il|Il|Id 或 Il|lT Tl|d|lT|dT 以标识符为例:l(l|d)*正规文法设有字母表=a1,a2,an,在字母表上的正规式和
5、它所表示的正规集(正规式描述的语言)用如下规则定义:1.是 上的正规式,它所表示的正规集是 ,即空集。2.是 上的正规式,它所表示的正规集仅含一空符号串,即。3.ai是上的一个正规式,它所表示的 正规集是由单个符号ai 所组成,即ai。3.3.1 正规式和正规集4.如果 e1和 e2 是上的正规式,它们所表示的正规集分别为 L(e1)和L(e2),则:(1)e1|e2是上的一个正规式,它所表示的正规集为L(e1|e2)=L(e1)L(e2)(2)e1.e2 也是上的一个正规式,它所表示的正规集为L(e1.e2)=L(e1)L(e2)(3)(e1)*也是上的一个正规式,它所表示的正规集为L(e1
6、)*)=(L(e1)*3.3.1 正规式和正规集 3.3.1 正规式和正规集 运算符的优先级:闭包“*”连接“”或“|”。连结符“”一般可省略不写。运算符均是左结合的。3.3.1 正规式和正规集 例1 设有字母表=a,b,有:1.a 和 b是正规式,相应正规集为2.a|b 是正规式,相应正规集为3.ab 是正规式,相应正规集为L(a)=a,L(b)=b L(a|b)=L(a)L(b)=a,bL(ab)=L(a)L(b)=ab=ab 3.3.1 正规式和正规集4.(a|b)*是正规式,相应正规集为 需要指出的是,a,b*的任一子集不一定是正规集。如:a,b*的子集 an bn|n1 L(a|b)
7、*)=(L(a|b)*=a,b*=,a,b,aa,ab,ba,bb,5.ba a*是正规式,相应的正规集为L(ba a*)=L(b)L(a a*)=b,ba,baa,baaa,6.(a|b)*(aa|bb)(a|b)*是正规式,相应正规集为 即上所有含两个相继a或两个相继b组成的串。L(a|b)*(aa|bb)(a|b)*)=L(a|b)*)L(aa|bb)L(a|b)*)a,b*aa,bba,b*3.3.1 正规式和正规集 3.3.1 正规式和正规集 例2 设=a,b,c,则 aa*bb*cc*是上的一个正规式,它所表示的正规集:L=abc,aabc,abbc,abcc,aaabc,=amb
8、nck|m,n,k1a+b+c+3.3.1 正规式和正规集 例3 设程序语言字母表是键盘字符集合,则程序语言部分单词符号可用如下正规式定义:关键字 if|else|while|do标识符 l(l|d)*l代表az中任一字母整常数 dd*d代表09中任一数字关系运算符 =3.3.1 正规式和正规集 注意:正规式与正规文法之间的区 别和联系:标识符 I=l(l|d)*l代表az中任一字母 d代表09中任一数字Il|Il|Id 3.3.1 正规式和正规集如果正规式 R1 和 R2 描述的正规集相同,则我们称正规式R1与R2等价。记为 R1R2。例如,(a|b)*=(a*b*)*;3.3.1 正规式和
9、正规集正规式具有如下性质:1A|B=B|A (交换律)2A|(B|C)=(A|B)|C (结合律)3A(BC)=(AB)C (结合律)4A(B|C)=AB|AC (分配律)5(A|B)C=AC|BC (分配律)6 A|A=A7 A*=AA*|=A|A*=(A|)*8(A*)*=A*令A,B 和 C 均为正规式,则 3.3.2 正规文法与正规式 1.正规文法到正规式的转换 (1)将正规文法中的每个非终结符表示成关于 它的一个正规式方程,获得一个方程组。(2)依照求解规则:若 X=X|(或 X=X+)则解为 X=*若 X=X|(或 X=X+)则解为 X=*以及正规式的分配律、交换律和结合律求关于
10、文法开始符号的正规式方程组的解。3.3.2 正规文法与正规式 例1 设有正规文法G:试给出该文法生成语言的正规式。正规式方程组如下:Z=0A (1)A=0A+0B (2)B=1A+(3)Z 0AA 0A|0BB 1A|3.3.2 正规文法与正规式 将(3)代入(2)中的B得A=0A+01A+0 (4)对(4)利用分配律得A=(0+01)A+0 (5)即正规文法GZ所生成语言的正规式是Z=0A (1)A=0A+0B (2)B=1A+(3)对(5)使用求解规则得A=(0+01)*0 (6)将(6)代入(1)式中的A,得Z=0(0+01)*0 R=0(0|01)*0 X=X+,则解为 X=*3.3.
11、2 正规文法与正规式 例2 设有正规文法G:A aB|bBB aC|a|bC aB 试给出该文法生成语言的正规式。正规式方程组如下:A=aB+bB (1)B=aC+a+b (2)C=aB (3)3.3.2 正规文法与正规式 将(3)代入(2)中的C得B=aaB+a+b (4)对(4)使用求解规则得B=(aa)*(a+b)(5)(5)代入(1)中的B得即正规文法GA所生成语言的正规式是A=(a+b)(aa)*(a+b)R=(a|b)(aa)*(a|b)A=aB+bB (1)B=aC+a+b (2)C=aB (3)X=X+,则解为 X=*3.3.2 正规文法与正规式 例3 设有正规文法G:相应的正
12、规式方程组为Z U0|V1 U Z1|1 V Z0|0 Z=U0+V1 (1)U=Z1+1 (2)V=Z0+0 (3)3.3.2 正规文法与正规式(2)和(3)代入(1)得Z=Z10+10+Z01+01 (4)对(4)使用求解规则得即正规文法GZ所生成语言的正规式是 Z=U0+V1 (1)U=Z1+1 (2)V=Z0+0 (3)Z=(10+01)(10+01)*R=(10|01)(10|01)*X=X+,则解为 X=*3.3.2 正规文法与正规式2.正规式到正规文法的转换(1)令 VT=。(2)对任何正规式R选择一个非终结符Z生 成规则ZR并令SZ。(3)若a和b都是正规式,对形如 Aab 的
13、 规则转换成 AaB 和 Bb 两规则,其中B是新增的非终结符。3.3.2 正规文法与正规式(4)对已转换的文法中,形如A a*b 的规 则,进一步转换 成 A aA|b。(5)不断利用规则(3)和(4)进行变换,直到 每条规则最多含有一个终结符为止。3.3.2 正规文法与正规式 例1 将 R=(a|b)(aa)*(a|b)转换成相应的 正规文法 令A是文法开始符号,根据规则(2)变换为 根据规则(3)变换为 A (a|b)(aa)*(a|b)A (a|b)BB (aa)*(a|b)3.3.2 正规文法与正规式对B根据规则(4)变换为 根据规则(3)变换为即前面例2中的文法。A aB|bBB
14、aaB|a|bA aB|bBB aC|a|bC aB A a*bA aA|b转换成B (aa)*(a|b)3.3.2 正规文法与正规式 例2 将描述标识符的正规式 R=l(l|d)*转换成相应的正规文法令I为文法的开始符号,根据规则(2)有 根据规则(3)变换为 根据规则(4)变换为 I l(l|d)*I lT T (l|d)*I lT T (l|d)T|3.3.2 正规文法与正规式进一步变换为 去掉 规则即前面描述标识符的右线性文法。I lT T lT|dT|I l|lT T l|d|lT|dT 3.4 正规式与有穷自动机 有穷自动机是具有离散输入与输出系统的一种抽象数学模型。有穷自动机有“
15、确定的”和“非确定的”两类,确定的有穷自动机和非确定的有穷自动机都能准确地识别正规集。3.4.1 确定有穷自动机确定有穷自动机(确定有穷自动机(DFA)一个确定有穷自动机M是一个五元组Q是一个有穷状态集合,每一个元素称为一个状态。是一个有穷输入字母表,每个元素称为一个输入字符。M=(Q,f,S,Z)表示当前状态为qi,输入字符为a时,自动机将转换到下一个状态qj,qj 称为qi 的一个后继状态。f 是一个从Q 到Q的单值映射:M=(Q,f,S,Z)f(qi,a)=qj (qi,qj Q,a )3.4.1 确定有穷自动机 单值函数是指 f(q i,a)唯一地确定了下一个要转移的状态。S1S2S3
16、S4abc 3.4.1 确定有穷自动机SQ,是唯一的一个初态。ZQ,是一个终态集。3.4.1 确定有穷自动机M=(Q,f,S,Z)例 设DFA M=(q0,q1,q2,a,b,f,q0,q2)其中 状态转换矩阵f(q0,a)=q1 f(q0,b)=q2 f(q1,a)=q1 f(q1,b)=q1 f(q2,a)=q2 f(q2,b)=q1 状态 字符 a q0 b q1 q2 q1 q1 q1 q2 q1 q2 3.4.1 确定有穷自动机 一个 DFA也可以表示成一张状态转换图。例中DFA M=(q0,q1,q2,a,b,f,q0,q2)的状态转换图如下图所示。f(q0,a)=q1 f(q0,
17、b)=q2 f(q1,a)=q1 f(q1,b)=q1 f(q2,a)=q2 f(q2,b)=q1 q0q1q2bbbaaa 3.4.1 确定有穷自动机 对符号串,若存在一条从初态结点到终态结点的道路,在这条路上所有弧的标记连结成的符号串等于,则称为DFA M所识别(或接受)。M所识别的符号串的全体记为L(M),称为DFA M所识别的语言。例中的DFA M所识别的语言为L(M)=ba*。q0q1q2bbbaaa 3.4.1 确定有穷自动机 3.4.2 非确定有穷自动机非确定有穷自动机(非确定有穷自动机(NFA)一个非确定有穷自动机M是一个五元组 其中:Q,Z 意义同DFA,f 和 S不同 于D
18、FA。M=(Q,f,S,Z)(1)状态转换函数f 是一个多值函数:f(qi,a)=某些状态的集合 非确定的有穷自动机还 允许 f(qi,)=某些状态的集合。由图可知 f(S1,a)=S1,S2,S3 (2)S Q,是非空初态集。是非空初态集。S1S2S3S4aaca 3.4.2 非确定有穷自动机其中 例 设有NFA M=(1,2,3,a,b,f,1,3,2)例中 NFA M对应的状态转换矩如下表所示。f(1,a)=3 f(1,b)=1,2 f(2,a)=f(2,b)=3 f(3,a)=f(3,b)=2 3.4.2 非确定有穷自动机状态 字符 a 1 b 2 3 3 1,2 2 3 例中 NFA
19、 M 对应的状态转换图如下图所示。1abb23bb 3.4.2 非确定有穷自动机其中 例 设有NFA M=(1,2,3,a,b,f,1,3,2)f(1,a)=3 f(1,b)=1,2 f(2,a)=f(2,b)=3 f(3,a)=f(3,b)=2 例中NFA M 所识 别的语言为 L(M)=b*(b|ab)(bb)*1abb23bb 3.4.2 非确定有穷自动机 例中 NFA M,对符号串=bbb可由3条路来识别。由NFA的定义可知,同一个符号串 可由多 条路来识别。第二条路:状态1状态1状态2;第一条路:状态1状态2状态3状态2;第三条路:状态3状态2状态3状态2;bb1ab23b 3.4.
20、2 非确定有穷自动机 DFA是NFA 的特例,即对于每个NFA M 存在 DFA M,使 L(M)=L(M)。因此,利用有穷自动机构造词法分析程序的方法:从单词的描述中构造出NFA;再将非确定的有穷自动机转化为确定的有穷自动机;将其化简为状态最小化的DFA;对DFA的每一个状态构造一小段程序将其转化为识别语言单词的词法分析程序。3.4.2 非确定有穷自动机 3.4.3 由正规式R构造NFA 输入:字母表上的正规式R 输出:识别(接受)语言L(R)的NFA M 1.引进初始结点X和终止结点Y,把R2.表示成拓广转换图2.用如下规则对R进行分裂和加进新结点,直至每个边上只留下一个符号或 为止方法:
21、XYR对于代换为ABr1r2ACBr1r2对于ABr1|r2代换为对于代换为ABr1*ABr1r2ACBr1 3.4.3 由正规式R构造NFA 3.分裂过程中,所有新结点均采用不同的名字,保留X,Y为全图唯一初态结点和终态结点。3.4.3 由正规式R构造NFA 例1 试构造识别标识符的NFA,描述标识符的正 规式R=l(l|d)*首先将R表示成如下拓广转换图 XYl(l|d)*从左到右分裂RX2Y1lld 3.4.3 由正规式构造NFA 例2 试构造识别语言R=(a|b)*abb 的NFA M,使 L(N)=L(R)。首先将R表示成拓广转换图 XY(a|b)*abb从左到右分裂RX12Y(a|
22、b)*3bbaX12Y3bba0ba 3.4.3 由正规式R构造NFA 例3 试构造正规式 R=0(l*)*|01 的NFA。首先将R表示成如下拓广转换图 XY01*从左到右分裂RX2Y101首先利用正规式的等价性化简正规式(l*)*=1*R=01*|01=0(1*|1)=01*(A*)*=A*A|A*=A*3.4.3 由正规式构造NFA 3.4.4 NFA确定化为DFA的方法 对于一个NFA,由于状态转换函数 f 是一个 多值函数,因此,对于它们有基本思想:f(q,a)=q1,q2,q3,qn也就是说,DFA的每一个状态代表NFA状态 集合的某个子集,称此构造方法为子集法。即是NFA状态集合
23、的一个子集,为了将NFA 转换为DFA,把状态集合q1,q2,q3,qn看作 一个状态A。输入:一个NFA M 输出:一个接受(识别)相同语言的DFA M 方法:利用构造闭包的方法将NFA确定化 为DFA。1.状态集合 I 的闭包的概念:设I是NFA M的一个状态子集,closure(I)定义 如下:(1)若sI,则 s closure(I)(2)若s closure(I),那么从s出发经过任意条弧能到达的任何状态 s,都属于 closure(I)3.4.4 NFA确定化为DFA的方法 即 closure(I)表示所有那些从I中的状态出发经过道路所能到达的NFA的状态所组成的集合,I中任何状态
24、也在其中,因为它们是通过通路到达自身的。该集合对DFA来说是一个状态。3.4.4 NFA确定化为DFA的方法 closure(0)=0,1,2,3例:这个状态集合实际就是要求的DFA的初态。0123456789bb 3.4.4 NFA确定化为DFA的方法 若令A=0,1,2,3,则令B=closure(4,7)=4,5,6,7,8,9B即是DFA在状态A下遇到输入符号b,转移到的后继状态。J=f(A,b)=f(0,b)f(1,b)f(2,b)f(3,b)=4,70123456789bb 3.4.4 NFA确定化为DFA的方法 2.从 NFA M 构造 DFA M 的算法 已知 NFA M=(Q
25、,f,x,y)求 DFA M=(I,f,初态,终态集)开始令I=3.4.4 NFA确定化为DFA的方法 3.4.4 NFA确定化为DFA的方法 步骤一:由NFA构造一张表:(1)表的列数由中的字符数确定:列数=字符数+1。第一列为I,第二列、第三列为Ia,Ib,其中a,b为中的字符。(2)第一列第一行元素为:_CLOSURE(X),X为NFA的开始状态。(3)由(2)中的状态出发,求Ia,Ib,其中Ia=_CLOSURE(J),J 表示(2)中的状态在读入a时转换成的状态集;Ib=_CLOSURE(J),J 表示(2)中的状态在读入b时转换成的状态集;。3.4.4 NFA确定化为DFA的方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 第03章 词法分析与有穷自动机 编译 原理 03 词法 分析 有穷 自动机
限制150内