收藏 分享(赏)

编译原理(4).ppt

上传人:tkhy51908 文档编号:8023658 上传时间:2019-06-04 格式:PPT 页数:68 大小:602.50KB
下载 相关 举报
编译原理(4).ppt_第1页
第1页 / 共68页
编译原理(4).ppt_第2页
第2页 / 共68页
编译原理(4).ppt_第3页
第3页 / 共68页
编译原理(4).ppt_第4页
第4页 / 共68页
编译原理(4).ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

1、第四章 词法分析,4.1 词法分析程序的设计 4.2 单词的描述工具 4.3 有穷自动机 4.4 正规式和有穷自动机的等价性 4.5 正规文法和有穷自动机间的转换 4.6 词法分析程序的自动构造工具,4.1 词法分析程序的设计接口方式,词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。 执行词法分析的程序称为词法分析程序或扫描程序。 词法分析是编译的第一阶段,它的后续阶段就是语法分析。词法分析与语法分析是如何衔接?它们的接口方式有两种。 A:词法分析工作可以是独立的一遍,把字符流的源程序变为单词流,输出在一个中间文件上,作为语法分析

2、的输入。 B:词法分析与语法分析放在同一遍里,没有中间文件。词法分析作为一个子程序,被语法分析程序不断调用。,4.1 词法分析程序的设计输出,词法分析程序的功能是读入源程序,输出单词符号。 单词符号是一个程序设计语言的基本语法符号。 单词符号有五种:基本字、标识符、常数、运算符、界符。 词法分析程序所输出的单词符号常常采用以下二元式表示(单词种别,单词自身的值). 其中单词的种别是语法分析需要的信息,而单词自身的值则是编译其他阶段需要的信息. 单词的种别可以用整数编码表示,如:标识符编码为1,常数为2, 保留字为3, 运算符为4, 界符为5.,源程序,词法分析程序,语法分析程序,Token,g

3、et token,4.1 词法分析程序的设计词法从语法中分离,词法是语法的一部分,词法描述完全可以归并到语法描述中. 编译过程中将词法分析和语法分析分成两个阶段可以有如下好处. 使整个编译程序的结构更加简洁 清晰 和条理化 编译程序的效率会改进.词法分析独立后,采用专门的读字符和分离单词的技术,构建词法分析程序的自动构造工具,实现单词的描述和识别. 增强编译程序的可移植性. 词法分析程序是对源程序进行逐个字符扫描,从而识别单词.在这一过程中能够完成:滤掉空格和注释;将错误信息与源程序位置联系;完成宏处理功能的预处理.,4.2单词的描述工具,程序设计语言中的单词是基本语法成分.单词符号的语法可以

4、用有效的工具加以描述,并且基于这类描述工具,实现词法分析程序的自动构造. 词法分析的根本依据就是准确地描述单词。反过来,如果有规范的单词描述工具,就可以进行自动的词法分析过程。,4.2.1 正规文法(3型文法),多数程序设计语言的单词的语法能用正规文法来描述 所谓正规文法就是3型文法。程序设计语言的单词的语法都能用3型文法描述。 3型文法G=(VN,VT,S,P)的特征,即P中的每一条规则都有下述形式:AaB或Aa其中A,BVN,aVT。(A,B属于非终结符; a属于终结符) l|l l|d|l|d d|d +|-|*|/| = ,|;|(|)|,4.2.2 正规式和它所表示的正规集,正规式是

5、描述单词符号最方便的工具。 设字母表为,辅助字母表=,|,.,*,(,)。 和都是上的正规式,它们所表示的正规集分别为,; 任何a,a是上的正规式,它所表示的正规集为a; 假定e1和e2都是上的正规式,它们所表示的正规集分别为L(e1),L(e2),那么,(e1),e1| e2,e1. e2和e1*也都是正规式,它们所表示的正规集分别是L(e1),L(e2)L(e2),L(e1)L(e2)和L(e)*; 仅由有限次使用上述三步骤而定义的表达式才是上的正规式,仅由这些正规式所表示的字集才是上的正规集。 程序设计语言中的单词都能用正规式来定义。(因此,正规式是描述单词的方便工具)。,正规式中的符号

6、,其中的“”读为“或”; “ ”读为“连接”; “”读为“闭包”(即,任意有限次的自重复连接)。 在不致混淆时,括号可省去,但规定算符的优先顺序为“”、“ ”、“” 。连接符“ ”一般可省略不写。 “”、“ ”和“” 都是左结合的。,例子,令=a,b, 上的正规式和相应的正规集的例子有: 正规式 正规集 a a ab a,b ab ab (ab)(ab) aa,ab,ba,bb a ,a,a,任意个a串,正规式: (ab) 正规集: ,a,b,aa,ab 所 有由a和b组成的串正规式:(ab) (aabb)(ab) 正规集:上所有含有两个相继的a或两个相继的b组成的串用“有穷”的公式,来描述“

7、无穷”的元素。是一个很好的工具。,讨论下面两个例子 例4.1 令=l,d,则上的正规式 r=l(l d) 定义的正规集为: l,ll,ld,ldd,其中l代表字母,d代表数字,正规式 即是 字母(字母|数字) ,它表示的正规集中的每个元素的模式是“字母打头的字母数字串”,就是Pascal和 多数程序设计语言允许的的标识符的词法规则.例4.2 =d,e,+,-, 则上的正规式 d(dd )(e(+- )dd )表示的是无符号数的集合。其中d为09的数字。 程序设计语言的单词都能用正规式来定义.,若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2。 例如: e1= (ab

8、), e2 =(ba) 又如: e1= b(ab) , e2 =(ba)be1= (ab) , e2 =(ab),设r,s,t为正规式,正规式服从的代数规律有: 1 rs=sr “或”服从交换律 2 r(st)=(rs)t “或”的可结合律 3 (rs)t=r(st) “连接”的可结合律 4 r(st)=rsrt(st)r=srtr 分配律 5 r=r, r=r 是“连接”的恒等元素 6 rr=r r=rrr “或”的抽取律,4.2.3 正规文法到正规式,一个正规语言可以由正规文法定义,也可以由正规式定义,在某种意义上,正规文法和正规式具有等价性。 有些语言适合用正规文法定义,有些语言适合用正

9、规式定义。因此根据需要可以进行正规文法和正规式之间的转换。,将上的一个正规式转换成文法G=(VN,VT,S,P)。 实际上,已知条件是字母表和它的正规式,需要确定的是文法的四个元素。其中,终结符可以由来担任,即终结符就是字母表(VT =)。可以设非终结符S为文法识别符号。事实上,需要做的工作就是确定非终结符集(VN)和产生式(P)。 产生文法的原则如下: 对任何的正规式r,定义非终结符S生成产生式Sr,并将S定为文法G的识别符号; 如果x和y都是正规式,对形如Axy的产生式,可以重写(拆分)成:AxB,By两个产生式,其中B就是一个新的非终结符; 对于形如:Ax*y的产生式,可以重写(拆分)成

10、:AxB,Ay,BxB,By四个产生式,其中B是一个新的非终结符; 对于形如:Ax|y的产生式,可以重写(拆分)成:Ax,By两个产生式; 利用这种规则不断地变换,直到每个产生式最多含有一个终结符为止。,例4.4 将R=a(a|d)*转换成相应的正规文法; 令S是文法的开始符号; 首先形成Sa(a|d)*; 然后形成SaA和A(a|d)*; 再重写第二条产生式形成: SaA、A(a|d)B、 A、B(a|d)B、B ; 进而变换为:SaA、AaB、 AdB 、A 、 BaB、 BdB 、B ;,将正规文法转换成正规式,将正规文法转换成正规式。是上述过程的逆过程,最后只剩下一个开始符号定义的产生

11、式,并且该产生式的右部不含非终结符。,例4.5,文法GS,SaA, Sa,AaA, AdA, Aa, Ad 先有:S=aA|a A=(aA|dA)|(a|d) 再将A的正规式变换为A=(a|d)A|(a|d) 再根据规则2变换A=(a|d)*(a|d) 再将A的右端代入S的正规式得:S=a(a|d)*(a|d)|a 利用正规式的代数变换得: S=a((a|d)*|(a|d)| ) 再利用正规式的代数变换得: S=a((a|d)* 最后 S=a((a|d)* 为所求。,4.3 有穷自动机,有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示

12、的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具。 有穷自动机分为两类:确定的有穷自动机DFA(Deterministic Finite Automata)和不确定的有穷自动机NFA(Nondeterministic Finite Automata) 。,4.3.1 确定的有穷自动机(DFA)的定义,一个确定的有穷自动机(DFA)M是一个五元组:M=(K,f,S,Z)其中 K是一个有穷集,它的每个元素称为一个状态; 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称为输入符号表; f是转换函数,是在KK上的映射,即,如 f(ki,a)=kj,(kiK,kj

13、K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态; SK是唯一的一个初态; Z K是一个终态集,终态也称可接受状态或结束状态。,一个DFA 的例子:,DFA M=(S,U,V,Q,a,b,f,S,Q)其中f定义为: f(S,a)=U f(V,a)=U f(S,b)=V f(V,b)=Q f(U,a)=Q f(Q,a)=Q f(U,b)=V f(Q,b)=Q,DFA的状态图表示,一个DFA可以表示成一个状态图(或称状态转换图)。 假定DFA M含有m个状态,n个输入字符,那么这个状态图含有m个结点,每个结点最多有n个弧射出; 整个图含有唯一一个

14、初态结点和若干个终态结点, 初态结点冠以双箭头“”或标以“-”,终态结点用双圈表示或标以“+”; 若 f(ki,a)=kj,则从状态结点ki到状态结点kj画标记为a的弧;,DFA的状态图表示,b,a,a,a,b,a,b,DFA的矩阵表示,一个DFA还可以用一个矩阵表示。 该矩阵的行表示状态,列表示输入字符。 矩阵元素表示相应状态行和输入字符列下的新状态,即k行a列为f(k,a)的值。 用双箭头“”标明初态;否则第一行即是初态, 相应终态行在表的右端标以1,非终态标以0。,DFA的矩阵表示,0 0 0 1,接受(识别),对于*中的任何字符串t,若存在一条从初态结点到某一个终态结点的道路,且这条路

15、上所有弧的标记符连接成字符串等于t,则称t可为DFA M所接受,若M的初态结点同时又是终态结点,则空字可为M所识别(接受)。 换一种方式,可叙述如下:若t*,f(S,t)=P,其中S为DFA M的开始状态,P Z,Z为终态集。则称t可为DFA M所接受(识别)。,进一步理解接受(识别),*上的符号串t在DFA M上运行 一个输入符号串t,(将它表示成Tt1的形式,其中T,t1 *) 在DFA M=(K,f,S,Z)上运行的定义为: f(Q, Tt1)=f(f(Q,T),t1) 其中QK 扩充转换函数f为 K*K上的映射,且: f(ki,)= ki,例:证明t=baab被下图的DFA所接受。 f

16、(S,baab)=f(f(S,b),aab)= f(V,aab)= f(f(V,a),ab)=f(U,ab)=f(f(U,a),b)=f(Q,b)=Q Q属于终态。得证。,进一步理解接受(识别),a,a,b,DFA的确定性,DFA的确定性表现在转换函数f:KK是一个单值函数。 也就是说,对任何状态kK,和输入符号a,f(k,a)唯一地确定了下一个状态。 从状态转换图来看,若字母表含有n个输入字符,那末任何一个状态结点最多有n条弧射出,而且每条弧以一个不同的输入字符标记。,DFA的确定性,DFA M所能接受的符号串的全体记为L(M). 对于任何两个有穷自动机M和M,如果L(M)=L(M),则称M

17、与M是等价的. 结论:上一个符号串集V是正规的,当且仅当存在一个上的确定有穷自动机M,使得 V=L(M)。,4.3.2 不确定的有穷自动机(NFA),NFA M=K,f,S,Z; 其中K为有穷非空集,它的每个元素为一个状态。 为有穷输入字母表,它的每个元素为一个输入字符。 f为K * 到K的子集(2 K)的一种映射; SK是初始状态集; ZK为终止状态集;,NFA的状态图表示,NFA含有m个状态和n个输入字符。它的状态图可以描述如下: 这张图含有m个状态结点 每个结点可射出若干条箭弧与别的结点相连接。 每条弧用* 中的一个串做标记。 整个图至少含有一个初态结点及若干个终态结点。,例4.7,一个

18、NFA M=(0,1,2,3,4,a,b,f,0, 2,4),其中 f(0,a)=0,3;f(0,b)=0,1;f(1,b)=2; f(2,a)=2; f(2,b)=2; f(3,a)=4; f(4,a)=4; f(4,b)=4;,0,1,2,3,4,a,a,a,b,a,b,a,b,b,b,例子 NFA M=(S,P,Z,0,1,f,S,P,Z) 其中 f(S,0)=P f(Z,0)=P f(P,1)=Z f(Z,1)=P f(S,1)=S,Z,类似DFA, 对NFA M=K,f,S,Z也有如下定义 *上的符号串t在NFA M上运行 一个输入符号串t,(我们将它表示成Tt1的形式,其中T,t1

19、 *)在NFA M上运行的定义为: f(Q, Tt1)=f(f(Q,T),t1) 其中QK. *上的符号串t被NFA M接受 若t *,f(S0,t)=P,其中S0 S,P Z, 则称t为NFA M所接受(识别) 对于中的任何一个串t,若存在一条从某一初态结到某一终态结的道路,且这条道路上所有弧的标记字依序连接成的串(不理采那些标记为的弧)等于t,则称t可为NFA M所识别(读出或接受)。若M的某些结既是初态结又是终态结,或者存在一条从某个初态结到某个终态结的道路,其上所有弧的标记均为,那么空字可为M所接受。,接受 000 111 1010001 110000001 不接受 00 01100,

20、NFA M所能接受的符号串的全体记为 L(M) 结论:上一个符号串集V是正规的,当且仅当存在一个上的不确定的有穷自动机M,使得V=L(M)。,(0|1)*(000|111)(0|1),DFA是NFA的特例.对每个NFA N一定存在一个DFA ,使得 L(M)=L(N)。对每个NFA N存在着与之等价的DFA M。 有一种算法,将NFA转换成接受同样语言的DFA.这种算法称为子集法. 与某一NFA等价的DFA不唯一.,4.3.3 NFADFA的转换,从NFA的矩阵表示中可以看出,表项通常是一状态的集合,而在DFA的矩阵表示中,表项是一个状态,NFA到相应的DFA的构造的基本思路是: DFA的每一

21、个状态对应NFA的一组状态. DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态.,状态集合的运算,1. 状态集合I的-闭包,表示为-closure(I),定义为一状态集,是状态集I中的任何状态S经任意条弧而能到达的状态的集合。状态集合I的任何状态S都属于-closure(I)。 2. 状态集合I的a弧转换,表示为move(I,a)定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。,I=1, -closure(I)=1,2; I=5, -closure(I)=5,6,2; move(1,2,a)=5,3,4 -closure(5,3,4)=2

22、,3,4,5,6,7,8;,I=0, -closure(I)=0,1,2,4,7; move(0,1,2,4,7,a)=3,8 -closure(3,8)=1,2,3,4,6,7,8;,a,NFA确定化算法,假设NFA N=(K, ,f,K0,Kt)按如下办法构造一个DFA M=(S, ,d,S0,St),使得L(M)=L(N): 1. M的状态集S由K的一些子集组成。用S1 S2. Sj表示S的元素,其中S1, S2,. Sj是K的状态。并且约定,状态S1, S2,. Sj是按某种规则排列的,即对于子集S1, S2= S2, S1,来说,S的状态就是S1 S2;,2 M和N的输入字母表是相同

23、的,即是; 3 转换函数是这样定义的: d(S1 S2,. Sj,a)= R1R2. Rt 其中 R1,R2,. , Rt = -closure(move(S1, S2,. Sj,a) 4 S0=-closure(K0)为M的开始状态; 5 St=Si Sk. Se,其中Si Sk. SeS且Si , Sk,. SeKt,构造NFA N的状态K的子集的算法,假定所构造的子集族为C,即C = (T1, T2,. TI),其中T1, T2,. TI为状态K的子集。 1 开始,令-closure(K0)为C中唯一成员,并且它是未被标记的。 2 while (C中存在尚未被标记的子集T)do 标记T;

24、 for 每个输入字母a do U:= -closure(move(T,a);if U不在C中 then 将U作为未标记的子集加在C中 ,将一组状态转换为一个状态,将不确定转换为确定.,4.3.4 确定有穷自动机的化简,说一个有穷自动机是化简了的,即是说,它没有多余状态并且它的状态中没有两个是互相等价的。 一个有穷自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机。 最小状态DFA的含义: 1.没有多余状态(死状态) 2.没有两个状态是互相等价(不可区别),所谓有穷自动机的多余状态,是指这样的状态:从自动机的开始状态出发,任何输入串也不能到达的那个状态;或者从这个状

25、态没有通路到达终态。 两个状态s和t等价:满足 兼容性同是终态或同是非终态 传播性从s出发读入某个aa和从t出发读入某个a到达的状态等价。,C和D同是终态,读入a到达C和F, C和F同是终态, C和F读入a都到达C,读入b都到达E. C和D等价 S和C不等价,因为C是终态,而S不是终态,“分割法”,DFA的最小化算法的核心 把一个DFA的状态分成一些不相交的子集,使得任何不同的两子集的状态都是可区别的 而同一子集中的任何两个状态都是等价的.,DFA的最小化例子,1.将M的状态分成非终态和终态集 S,A,B C,D,E,F 2 .寻找子集中不等价状态S,A,B C,D,E,F 3. P=S,A,

26、B,D,a,a,b,B,S,S,4.4正规式和有穷自动机的等价性,对有穷自动机和正规表达式进行了上述讨论之后,我们介绍有穷自动机和正规表达式的等价性,即: 1.对于上的一个NFA M,可以构造一个上的正规式R,使得L(R)=L(M)。 2.对于上的一个正规式R,可以构造一个上的NFA M,使的L(M)=L(R)。,1.对于上的一个NFA M,可以构造一个上的正规式R,使得L(R)=L(M)。,我们把状态转换图的概念拓广,令每一条弧可用一个正规式作标记。 第一步,在M的状态转换图上加进两个结点,一个为X结点,一个为Y结点,从X结点用弧连接到M的所有初态结点,从M的所有终态结点用弧连接到Y结点,形

27、成一个与M等价的M, M只有一个初态和一个终态,第二步,逐步消去M中的所有结点,直至只剩下X 和Y结点 其消结规则如下:,最后x和y结点间的弧上的标记则为所求的正规式R。,B,C,0,1,1,0,A,X,B,C,Y,0,1,1,0,X,A,0,1,A,10,X,Y,(0|1)*10,Y,2.从上的一个正规式R构造上的一个NFA M,使得L(M)=L(R)的方法。,“语法制导”的方法 首先将正规式分解成一系列子表达式 然后使用如下规则为R构造NFA,对R的各种规则具体描述如下:,对于正规式x,x 构造的NFA(两种),X,S,对于正规式 ,构造的NFA,对于正规式r, r= R1|R2构造的NF

28、A,对于正规式r, r=R1R2构造的NFA,对于正规式r, r=R1*构造的NFA,R= (a|b)* 构造为NFA N,解:从左到右分解R,令r1=a,则有,令r2=b,则有,令r3=a|b,则有,令r3=(a|b)*,则有,3,a,5,b,1,6,2,4,0,7,R= (a|b)*ab 构造为NFA N,x,i,a,b,y,i,b,a,将R=(a|ab)* b b*构造为NFA N,正规文法与有穷自动机之间转换,GS: SaA SbB S AaB AbA BaS BbA B,S,A,Z,B,a,b,a,b,a,b,正规文法与有穷自动机之间转换,GS: AaB AbD BbC CaA CbD C DaB DbD D,正规式用于说明(描述)单词的结构十分简洁方便。而把一个正规式编译(或称转换)为一个NFA进而转换为相应的DFA,这个NFA或DFA正是识别该正规式所表示的语言的句子的识别器。基于这种方法来构造词法分析程序,LEX是一个广泛使用的工具。 词法分析程序的设计技术可应用于其它领域,比如查询语言以及信息检索系统等,这种应用领域的程序设计特点是,通过字符串模式的匹配来引发动作。 词法分析程序的自动构造工具也广泛应用于许多方面,如用以生成一个程序,可识别印刷电路板中的缺陷,又如开关线路设计和文本编辑的自动生成等。,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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