收藏 分享(赏)

第3章词法分析.ppt

上传人:fmgc7290 文档编号:7877935 上传时间:2019-05-28 格式:PPT 页数:150 大小:978KB
下载 相关 举报
第3章词法分析.ppt_第1页
第1页 / 共150页
第3章词法分析.ppt_第2页
第2页 / 共150页
第3章词法分析.ppt_第3页
第3页 / 共150页
第3章词法分析.ppt_第4页
第4页 / 共150页
第3章词法分析.ppt_第5页
第5页 / 共150页
点击查看更多>>
资源描述

1、1,第3章 词法分析,人们理解一篇文章(或一个程序)起码是在单词的级别上来思考的。同样,编译程序也是在单词的级别上来分析和翻译源程序的。词法分析的必要性 描述单词的结构比其它语法结构简单,仅用3型文法就够了; 将单词识别从语法分析识别分离出来,可采用更有效的工具实现; 有些语言的单词识别与前后文相关,不宜将其与语法分析合并; 使编译程序各部分独立出来,有利于设计、调试和维护执行词法分析的程序称为词法分析器(扫描器)的输出是语法分析程序的输入本章讨论词法分析程序的手工构造方法和自动构造方法。,2,教学内容,3.1 词法分析程序 3.2 单词的描述工具 3.3 有穷自动机 3.4 正规文法和有穷自

2、动机间的等价 3.5 正规文法和有穷自动机间的转换 3.6 词法分析程序的设计,3,学习目标:,掌握:词法分析程序的构造,正规式和正规文法到有穷自动机的转换,NFA到DFA的转换、DFA的化简 理解:正规文法、正规式、DFA的概念、NFA的概念 了解:词法分析程序的自动构造工具,4,3.1 词法分析程序,词法分析器的功能是输入源程序,输出单词符号。,通常把词法分析程序设计为语法分析程序的子程序。每当语法分析程序需要一个单词符号时,就向词法分析程序发出“取下一个单词符号”的调用命令。 词法分析程序就从输入字符串中,识别出一个具有独立意义的单词符号,并传送给语法程序。,1.词法分析器的功能和输出形

3、式,5,单词符号是一个程序语言的基本语法符号。 称作 token(记号) 具有独立意义的最小语法单位。,语言的单词符号,词法分析程序是以字符串形式的源程序作为输入,以单词符号或单词符号表示的源程序作为输出。,将字符组合成记号与在一个英语句子中将字母构成单词并确定单词的含义很相像,此时的任务很像拼写。,6,关键字:是由程序语言定义的具有固定意义的标识符,也称保留字或基本字。如Pascal中的 begin、end、if、integer等,C 中的if、else、do、while,C+ 中的class、int、switch、break等都是保留字,它们一般不用作一般标识符。 标识符:用来表示各种名字

4、,如变量名、常量名、数组名、函数名、子程序名等。 常数:程序中出现的各种类型的常量。常量的类型一般有整型、实型、布尔型、字符型等。如 125、0.718、TRUE、“Hello” 等。 运算符:表达式中连接运算对象的符号。如+、-、*、/、 等。 界符:程序中的定界符。如逗号、分号、括号、/*、*/ 等。,程序语言的单词符号一般可分为下列五种:,7,词法分析程序输出单词的形式,词法分析器所输出的单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值),单词种别(它是语法分析需要的信息) 通常用整数编码。 一个语言的单词符号如何分种,分成几种,怎样编码,是一个技术性的问题。它主要取决于处理

5、上方便。 标识符一般统归为一种。 常数则按类型分种。 关键字可将其全体视为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一符一种的分法,但也可以把具有一定共性的运算符视为一种。 至于界符一般用一符一种的分法。,8,单词自身的值(单词符号的属性值,它是编译其它阶段需要的信息) 属性值是指单词符号的特性或特征,可以是标识符在符号表的入口地址、数值的二进制值等。,如果是一符一种的分法,词法分析器只给出其种别编码,不给出其属性值。 如果一个种别含有多个单词符号,那么对于它的每个单词符号,除了给出种别编码之外,还应给出导出符号的属性值,以便把同一种类的单词区别开来。 标识符属

6、性值是自身的符号串;也可是在符号表的入口地址。 常数自身值是常数的二进制数值。,9,【例】试给出程序段 if (a1) b = 100;输出的单词符号串。,假定基本字、运算符和界符都是一符一种,标识符自身的值是字符串,常数是二进制值。,10,经词法分析器处理后,它将被转换为如下的单词符号序列:( while ,- ) ( ( ,- ) ( id ,指向i的符号表表项的指针 ) ( = ,- ) ( id ,指向j的符号表表项的指针 ) ( ) ,- ) ( id ,指向i的符号表表项的指针 ) ( - ,- ) ( ; ,- ),【例】考虑下述 C+ 代码段: while ( i = j )

7、i-;,另一种表示,假定基本字、运算符和界符都是一符一种,标识符自身的值是符号表的入口地址,常数是二进制值。,11,2.词法分析器作为一个独立子程序,把词法分析器安排为一个独立的阶段的好处是,它可使整个编译程序的结构更简单、清晰和条理化。词法分析比语法分析要简单得多,可用更有效得特殊方法和工具进行处理。把词法分析器安排为独立的一遍,让它把整个源程序翻译成一连串的单词符号(二元式)存放于文件中,待语法分析程序进入工作时再对从文件输入的这些单词符号进行分析。把词法分析器安排为一个子程序,每当语法分析分析器需要一个单词符号时就调用这个子程序。每一次调用,词法分析器就从输入串中识别出一个单词符号。在后

8、面的讨论中,我们假定词法分析器是按这种方式进行工作的。,12,相对独立方式,当采用递归下降分析等技术实现一趟编译程序时常采用这种方式。,源程序,词法分析程序,语法分析程序,Token,get token,.,13,完全独立方式,采用词法分析工作完全独立的原因: 简化设计,降低语法分析的复杂性 提高编译效率 增加编译系统的可移植性,源程序,词法分析程序,语法分析程序,属性字序列,.,14,3.源程序的输入,在内存开辟缓冲区,将程序文本放进该缓冲区 预处理:删除无用字符等 词法分析程序对缓冲区扫描时,设置两个指示器,一个指向当前正在识别的单词的开始位置,称为起始指针;另一个用于向前搜索,以寻找单词

9、的终点,称为扫描指针。,起始指针,搜索指针,15,识别标识符的若干约定和策略,一般来说,单词的长度是有限制的 在允许长度下,应按最长匹配原则进行识别 有时需要超前扫描来进行单词识别。例如,FORTRAN语言中的算术条件句 IF(e)=L1,L2,L3和语句函数定义句 IF(x)=f(x)中的IF的识别;以及等。 在进行超前扫描时,还应注意“回退”字符,即将多吃掉的字符退还回输入缓冲区。使用堆栈实现多字符回退的算法。,16,单词符号的构成规则 标识符,0,1,2,字母(a-z),字母或数字(a-z0-9),其它,*,此时,超前搜索了一个字符,17,3.2 单词的描述工具,作用: 描述单词的构成规

10、则,基于这类描述工具建立词法分析技术,进而实现词法分析程序的自动构造. 工具有: 正规文法正规式(Regular Expression),18,1.正规文法,多数程序设计语言单词的语法都能用正规文法(3型文法)描述 正规文法回顾文法的任一产生式的形式都为AaB或Aa,其中A ,BVN ,a VT 。正规文法描述的是VT*上的正规集,19,例如 :用l表示az中的任一英文字母,d表示09中任一数字 描述标识符的正规文法为llldld 描述无符号整数的正规文法dd,20,为什么要引进正则表达式?,对于字母表,我们感兴趣的是它的一些特殊字集正规集。 正规集是字母表上的符合一定规则的符号串构成的集合

11、正则表达式是一种适合描述符号的表示法,可由它定义正规集。,21,2.正规式(regular expression),定义(正规式和它所表示的正规集): 设字母标为 1 和都是上的正规式,它们所表示的正规集分别为和; 2 任何a ,a是上的一个正规式,它所表示的正规集为a; 3 假定e1和e2都是上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1), e1e2, e1e2, e1也都是正规式,它们所表示的正规集分别为L(e1), L(e1)L(e2), L(e1)L(e2)和(L(e1)。(递归) 4 仅由有限次使用上述三步骤而定义的表达式才是上的正规式,仅由这些正规式所表

12、示的字集才是上的正规集。,22,(e1), e1e2, e1e2, e1 L(e1), L(e1)L(e2), L(e1)L(e2)和(L(e1)。 其中的“”读为“或”(也有使用“+”代替 “” 的);“ ”读为“连接”;“”读为“闭包”(即,任意有限次的自重复连接)。在不致混淆时,括号可省去,但规定算符的优先顺序为“”、“ ”、“” 。连接符“ ”一般可省略不写。“”、“ ”和“” 都是左结合的。,23,例 令=a,b, 上的正规式和相应的正规集的例子有:正规式 正规集 a a ab a,b ab ab (ab)(ab) aa,ab,ba,bb a ,a,a, 任意个a的串 (ab) ,a

13、,b,aa,ab 所有由a 和b组成的串 (ab)(aabb)(ab) 上所有含有两个相继 的a或两个相继的b组成 的串,24,例 =l,d,r=l(l d) 定义的正规集: l,ll,ld,ldd,(标识符) 例 =d,.,e,+,-,则上的正规式 d(.dd )(e(+- )dd )表示的是无符号数的集合。其中d为09的数字。,举例,25,例: 2=A,B,0,1, 则 (A|B)A|B|0|15是2上的正则表达式 (A|B)A|B|0|15的值,即L( (A|B)A|B|0|15 ),是这样一个正则集,每个字符串都是以字母A或B打头,后跟以至多5个字母(A或B)或数字(0或1) (0|1

14、)(0|1)* 上的“数”的全体,26,正规式的运算律,设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 “或”的抽取律,27,程序中的单词都能用正规式来定义令l为az的字母,d为09的数字 e1= l ( l | d)* e1表示标识符集合 e2= dd* e2表示无符号整数注(比较): ll ldld 正规式比正规文法更容易让人理解单词是

15、按怎样的规律构成的,且可以从某个正规式自动地构造识别程序。,28,两个正规式等价,若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2。例如: e1= (ab), e2 = ba又如: b(ab) = (ba)b (ab) = (ab),29,3.正规文法和正规式间的转换,等价性: 对任意一个正规文法,存在一个定义同一语言的正规式 对任意一个正规式,存在一个定义同一语言的正规文法,30,将上的一个正规式r转换成文法G=(VN,VT,S,P) VT= ,首先形成产生式Sr,S为G的开始符 不断利用下面的规则做变换,直到每个产生式最多含有一个终结符为止,其中B为一新非终结符

16、,31,例: 将R=a(a|d)*转换成相应的正则文法 令转换成文法G=(VN,VT,P,S) 其中VT=a,d, 文法开始符为S 首先形成Sa(a|d)*,然后变换 SaA A(a|d)*,A(a|d)A A,AaA AdA,最终有产生式: SaA , A , AaA,AdA,32,将正规文法转换成正规式 将每条产生式改写为正规式 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式,其中不含非终结符 正规文法到正规式的转换规则:,33,例:将文法GS转换成正规式G:Sa A|aAdA|d 先由产生式得: S=aA|a A=d*d 将A代入S中得: S=ad*d|a 利用正规式变换得

17、S=a(d*d|)=ad*说明:d*d| =(|d|dd|)d|=d|dd|= d* 所求正规式为ad*,34,3.3 有穷自动机 (Finite Automata),1. 状态转换图 2. 确定有穷状态自动机(DFA) 3. 非确定有穷状态自动机(NFA) 4. 把NFA变为DFA 5. DFA的化简,35,1.正规文法和状态转换图,正规文法定义了3型语言,常见的单词可由正规文法定义。 状态转换图可用于识别3型语言;它是设计和实现扫描器的一种有效工具,是有限自动机的直观图示,36,由正规文法构造状态转换图,程序设计语言的单词都能用正规文法描述; 例如,标识符可定义为字母 数字 字母 若把字母

18、、数字视为终结符,则上述产生式为(左线性)正规文法 若我们用d表示0-9间的数字,则C语言的的文法也是(右线性)正规文法(见P48),一般说来,凡能用正规文法描述的语言,均可由某种有限状态算法状态转换图进行分析。 状态转换图 由有限个结点所组成的有向图。 每个结点代表在识别分析过程中扫描器所处的状态,其中 含有一个初始状态和若干个终态。在图中,状态用圆圈表示,终态用双层圆圈表示。 状态之间可用有向边连接,其上标记一字符a,表示从有向边的射出状态出发,识别一字符a后,将进入箭头所指状态(结点),37,1)由右线性文法构造状态转换图,设G=(VN,VT,P,S)是一右线性文法,并设|VN|=K,则

19、所要构造的状态转换图共有K+1个状态(结点).用VN中的每个符号分别标记其中的K个结点,且令G的开始符S为初态结点;余下的一个结点作为终态结点,用F(VN)标记.我们用如下规则来连接这K+1个结点: (1)对于G中产生式AaB,从结点A引一有向边到结点B,并用a标记这一有向边; (2)对于G中产生式Aa,从结点A引一有向边到终态结点F,并用a标记这一有向边; (3)对于G中产生式A(若有的话),则将结点A设为终态. 例如,P48中定义的无符号数的文法对应的为(化简后):,38,利用状态转换图识别符号串的方法,对于已给的字符串w=a1a2an,aiVT,利用对w 识别的步骤如下: (1)从初始状

20、态S出发,自左至右逐个扫描w的各个字符(当前为a1),此时在结点S所射出的诸矢线中,寻找标记为a1的矢线(若不存在,则表明w有语法错误),读入a1并沿矢线所指方向前进,过渡到下一状态(设为A1). (2)设当前处在Ai状态,所扫描的字符为ai+1,在结点Ai所射出的诸矢线中,寻找标记为ai+1的矢线(若不存在,则表明w有语法错误),读入ai+1,并进入状态Ai+1; (3)重复(2),直到w中所有字符被读完且恰好进入终态F时,宣告整个识别结束,w可被接受. 显然,若我们从初态出发,分别沿一切可能的路径到达终态结点,并将中径中矢线上所标记的字符依次连接起来,便得到状态转换图所能识别的全部符号串,

21、这些符号串组成的集合构成了该识别的语言,39,状态转换图与文法推导,用状态转换图识别符号串w的过程,就是为w建立一个推导S* w的过程。 在第一步(在初始状态S下,扫描到a1而过渡到下一状态A1),由状态转换图的构造规则可知,G中必有产生式Sa1A1;对于识别过程的后续步骤,由状态Ai识别ai+1后过渡到Ai+1恰好对应了使用产生式Ai ai+1Ai+1,最后在状态An-1识别an后到达终态F,对应了使用产生式 A an 进行推导: S a1A1 a1a2A2 a1a2an-1An-1 a1a2an,40,右线性文法与状态转换图,设G是一右线性文法,M是相应的状态转换图,则从前面的讨论可以看出

22、如下事实: (1)在利用M对符号串w进行识别时,M中每次状态的转换都模拟了一步直接推导,即识别方法(或称分析方法) 是“”的; (2)因右线性文法只有形如AaB、A a的产生式,所以推导的每一步所得句型只含一个非终结符,所以推导的规范的,每步所得的句型也必为规范句型; (3)对于M所识别的任一符号串x,必存在G中的一个推导S * x (即有xL(G);反之,对于L(G)中任一句子y,必存在一条从初态S到终态F的路径,此路径上各矢线的标记依次拼接起来所组成的符号串恰为y,41,2)由左线性文法构造状态转换图,设G=(VN,VT,P,S)是一左线性文法,构造相应的状态转换图的方法是: 首先用G的V

23、N符标记M的结点,其中,开始符S对应的结点为终态结点.另外,再引入一个新结点R(VN)作为初态.矢线的连接规则为: (1)对于G中形如Aa 的产生式,引矢线:RA,且标记为a; (2)对于G中形如ABa 的产生式,引矢线 BA,且标记为a.,42,由左线性文法构造状态转换图的例子,已给文法G=(S,U,0,1,SS1 |U1, UU0 | 0,S),R,U,S,U0,0,U U0,0,S U1,1,S S1,1,用左线性文法构造出的状态转换图来识别文法的句子,其过程与前面右线性文法构造的状态转换图用法一样,这里不再赘述. 不过,就识别的方法而言,它却属于“”分析. 我们以句子00011为例,给

24、出其识别的的步骤.见右表.,步骤 当前状态 余留的符号串 1 R 00011 2 U 0011 3 U 011 4 U 11 5 S 1 6 S (识别结束),43,识别符号串与归约,由构造状态转换图的方法可知,从初态R到下一状态A的转换,对应了形如Ba 的产生式,即将终结符a归约成非终结符B; 类似地,从状态B转换到状态A,对应了形如ABa的产生式,即将Ba归约为A; 如此下去,直到从某状态A转换到状态S(终态),对应了形如S Aa的产生式,即将Aa归约为开始符S.此时归约成功,也恰好进入了终态,即状态转换图识别了(或接受)该符号串. 前面识别00011的例子对应的归约过程见右图,0 0 0

25、 1 1,U,U,U,S,S,44,对句子ababaaa的分析,步骤 当前状态 输入的其余部分S ababaaaA babaaaB abaaaA baaaB aaaA aaZ aZ,a b a b a a a,A,B,A,B,A,Z,Z,(a) 分析过程,(b) 语法树,45,词法规则的描述,状态转换图 难于书写,非线性结构 更好的方式的要求 线性方式表达 与状态转换图等价 正规表达式 a-za-z|0-9*,46,2.有穷自动机(也称有限自动机),是一种识别装置 作用:能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合 意义:为词法分析程序的自动构造寻找特殊的方法和工具。 分

26、类:确定的有穷自动机(Deterministic Finite Automata)不确定的有穷自动机(Nondeterministic Finite Automata),47,确定的有限自动机DFA,1)抽象地看,状态转换图由五个部分组成: (1)有限个状态之集,记作K; (2)有限个输入符号组成的字母表,记作; (3)从K到K的转换函数 f: KK. f(p,a)=q表示若当前状态为p,且输入符号为a,则进入下一个状态为q; (4)S0K,初始(开始)状态; (5)若干个终态之集: Z( K ) 由上述五个要素组成的五元式 M=(K, , f,S0,Z )称为一个确定的有限自动机 (DFA:

27、 Deterministic Finite Automata) 由此可见,一DFA实际上是状态转换图的形式描述(数学定义),状态转换图是DFA的几何(图形)表示.,“确定”即状态转换函数是单值函数!,48,DFA的接受集,2)为定义DFA所接受(或识别)的符号串集合,我们先将其转换函数f 的定义域拓广到K* : (1)f (s,)=s, sK; (2)f (s,aw)=f ( f(s,a),w), sK,a,w*; 由上面的定义可知,对于x* ,f(s,x)=t 的含义是,当M从状态s出发,依次扫描完x的各个符号后将进入状态t.即只要f有定义,f与f的效果是一致的. 我们称DFA M接受(或识

28、别)某符号串x*,用状态转换图来说,就是从初态S0出发,经一恰好标有x 的路径后可达到某终态SZ ;用f描述就是: SZ, f(S0,x)=S M的接受集 我们把一DFA M所接受的符号串的全体称为M的接受集,记为L(M),即 L(M)= x | f(S0,x) Z,x* ,49,确定的有限自动机,我们之所以把前面定义的有限自动机称为确定的FA,是因为在状态转换的每一步,根据FA当前的状态及扫描的输入字符,便能唯一地确定FA的下一状态。在转换图上看,若|=n,则任何结点所引出的矢线至多有n条,且矢线上的标记均不同。 例如,P51图3-4所对应的DFA为 M=(R,U,S,0,1,f,R,S)

29、其中,f的定义如下:f(R,0)=U f(U,0)=U f(U,1)=S f(S,1)=S 由DFA与状态转换图的关系可知,构造状态转换图的算法,同样适用于构造DFA。 实际上,我们可以证明,正规文法G,DFA M,使 L(M)=L(G),反之亦然。,50,从状态转换图构造有穷状态自动机,例如:从下面状态图构造DFA DFA D=(S,Z,A,B,a,b,M,S,Z) 其中M定义为:M(S,a)=A M(S,b)=B M(A,a)=Z M(A,b)=B M(B,a)=A M(B,b)=Z M(Z,a)=Z,a,b,S,A,B,a,b,Z,b,a,a,51,运行DFA与识别一个字符串,定义: 对

30、于某DFA D=(K,M,S,F),如果M(S,t)=P, PF,则称符号串t可被DFA D所接受。 运行一个DFA的过程:识别一个符号串是否被接受,52,举例,如前例:DFA D=(S,Z,A,B,a,b,M,S,Z) M(S,a)=A M(S,b)=B M(A,a)=Z M(A,b)=B M(B,a)=A M(B,b)=Z M(Z,a)=Z 则:M(S, ababaa)=M(M(S,a), babaa) =M(A,babaa)= M(M(A,b), abaa)= M(B,abaa)=M(A,baa)= M(B,aa)=M(A,a)= Z,53,正则集,正则集:L(D),是一个DFA接受的字

31、符串集合 正则语言与正则集:L(G)=L(D) 最小状态自动机:状态个数最少,唯一,54,DFA 的矩阵表示法,a,b,S,A,B,a,b,Z,b,a,a,矩阵行代表状态,列代表输入字符, 矩阵元素是映像得到的新状态。,55,3.非确定的有限自动机,若在一左线性文法中含有多个右部相同的产生式,如 AUa BUa CUa XUa, 或在一右线性文法中同时含有形如 UaA UaB UaC UaX 的产生式, 在相应的状态转换图中,就会出现这样的结点U,它具有多条标记为同一输入符号a的矢线,如右图所示,图3-8 NFA的状态转换图,由上图可知,在U状态下,输入符号为a时,FA的下一状态不唯一,而是在

32、状态集A,B,C,X中任选其一。具有这种性质的FA称为非确定的FA(NFA: Nondeterministic FA),56,非确定有限自动机的定义,在形式上,NFA M同样可用五元式定义:M=(K,f,S0,Z),其中,K, ,S0,Z的含义同DFA,转换函数f的定义为 f: K(K),即将(Si,aj)映射到K的一个子集Sk1,Skm 类似地,我们可把f的定义域拓广到K* : (1) f(S,)=S; (2)f(S,aw)=f(f(S,a),w) a,w*. 再设 f(S,a)= Sk1,Skm ,且定义,这样,我们已把f的定义域扩大到(K) *。根据类似的理由,我们将对f和f不加区分,5

33、7,NFA的接受集,对于x*,若集合f(S0,x)中含有Z中的元素(终态),则说明,至少存在一条从初态S0到某一终态的路径,此路径上的符号之连接恰为x,此时,我们称x为M所接受 所有为M所接受的符号串之集称为NFA M的接受集(或识别集),记作 L(M).即 L(M)=x | f(S0, x ) Z , x 例3.1 给定M= (S,A,B,C, a,b, f , S ,C),其状态转换图见右。由图可知M是一NFA。 M识别符号串ababb的路径为 S(a)A(b)B(a)A(b)B(b)C(接受)。(参见书中P60的表),注意,NFA识别输入符号串时有一个试探过程,为了能走到终态,往往要走许

34、多弯路(带回溯),这影响了FA的效率。 能否提高其工作效率就是我们下一小节讨论的课题。事实上,对任一NFA M,总可构造一个DFA M,使 L(M)=L(M)成立。这就是NFA与DFA的等价性。,58,DFA与NFA的区别,59,举例,前述文法G3.2对应的自动机NFA N=(S,A,B,Z,a,b,M,S,Z) 其中M: M(S,a)=A M(S,b)=B M(A,a)=Z M(A,b)=B M(B,a)=A,B M(B,b)=Z M(Z,a)=A,Z,a,b,S,A,B,a,b,Z,b,a,a,a,a,60,举例(字符串被NFA所接受),对于输入字符串babbabb,运行NFA,a,b,A

35、,B,a,b,Z,b,a,a,a,a,S,61,运行NFA,运行NFA:识别一个字符串是否被NFA所接受,是否能达到终态集合中的某个状态 实质:用自底向上方法识别句子 状态转换的下一状态不唯一,如何解决?,62,DFA和NFA的关系,对于*上的字符串,如果存在一条从初态到终态的通路,且这条通路上的输入字符恰好连接成,称为可以此DFA、NFA识别 DFA、NFA都可以识别一个字符集上的字符串 可以用DFA、NFA定义上的字符串的集合 DFA都是NFA、NFA可化为等价的DFA,63,构造与正规式等价的NFA方法,X,Y,|,1,2,1,2,64,3,1,3,2,1,2,2,1,*,1,2,65,

36、构造与正规式等价的NFA示例,a(a|b)*,X,Y,a(a|b)*,X,Y,a,1,(a|b)*,66,X,Y,a,1,(a|b),2,X,Y,a,1,a,2,b,67,4.NFA的确定化方法,初态的唯一化 终态的唯一化 从初态集开始,求对于每个输入符号的后继状态集合Si新的状态 对每个Si,求对于每个输入符号的后继状态集合Si+1 直到不产生新的后继状态集合 含有终态的状态集合为终态,68,举例,例: 为NFA N=(S,A,B,Z, a,b, M, S, Z)构造DFA.设它对应的DFA N= (K, a,b, M, S, F),a,b,S,A,B,a,b,Z,b,a,a,a,a,K=S

37、M(S,a)=A M(S,b)=BK=S,A,BM(A,a)=Z M(A,b)=B M(B,a)=AB M(B,b)=ZK=S,A,B,Z,ABM(Z,a)=AZ M(Z,b)= M(AB,a)=ABZ M(AB,b)=BZ K=S,A,B,Z,AB,AZ,BZ,ABZ M(AZ,a)=AZ M(AZ,b)=B M(BZ,a)=ABZ M(BZ,b)=Z M(ABZ,a)=ABZ M(ABZ,b)=BZ,69,举例(续1),a,b,S,A,B,a,b,Z,b,a,a,a,a,根据左边状态转换矩阵,可以得到DFA N的状态集合(表的左列状态),即 K=S,A,b,Z,AB,AZ,BZ,ABZ,7

38、0,举例(续2),S,B,AB,ABZ,A,Z,BZ,AZ,b,b,b,b,b,b,b,a,a,a,a,a,a,a,a,开始状态:S,终止状态:Z,AZ,BZ,ABZ,根据上面状态转换矩阵,同时可以得到N的映像函数,根据该映像可以画出它的状态转换图(如下)。终态集合中的元素为:由新映像得到的状态、 且这些状态包含原NFA N的终态集合中的状态。,71,NFA的确定化示例,状态转换矩阵,a b X 1,2,Y 1 2,Y 2,Y 2 2,Y 2,Y Y ,X,Y,a,1,a,2,b,a(a|b)*,72,a b X 1,2,Y 1 2,Y 2,Y 2 2,Y 2,Y Y ,a b X 1,2,Y

39、 1,2,Y 2,Y 2,Y 2,Y 2,Y 2,Y,NFA状态转换矩阵,1) (2) (3),a b 1) (2) (2) (3) (3) (3) (3) (3),等价的DFA状态转换矩阵,73,a b 1) (2) (2) (3) (3) (3) (3) (3),1,3,a,a,b,a,b,2,74,NFA确定化的例子,M=(S0,S1,a,b,f,S0,s1),_f_|_a_ b_ S0 |S0,S1 S1 S1 | S0,S1,M=(K,a,b,f,S0,S1,S0,S1)f | a b . | new state | | S0 | S0S1 S1 | 1 S1 | S0S1 | 2

40、S0S1| S0S1 S0S1 | 3,75,具有 动作的FA,若在一FA中,允许对也作状态转移,则这样的FA称为具有动作的FA(NFA).此时,有的矢线上标记为 标记为 的矢线对识别符号串无影响,但却改变了当前的状态. 例如,右图中的FA中,从状态0到状态3存在路径: 0(a) 0(a)0() 2(c) 2(c) 2() 3,即M识别了aacc=aacc. 的定义 M=(K,f,S0,Z),其中,f的定义为 f:K()(K). 在中, 可以视为一个输入符号,在矩阵表示中,也有相应的列.,f也可以拓广到f:K* (K). f(S,x)是由这样的状态Q组成,存在从S到Q的路径,该路径上的连线标记

41、组成的符号串恰好为x,其中,允许有有限个标记为,76,状态S的-闭包:-CLOSURE(S),为定义拓广的f,我们首先引入每个状态S的-闭包的定义: -CLOSURE(S),它是从S出发经过若干标记为的矢线所能达到的全部状态之集,其归纳定义如下: (1)S-CLOSURE(s); (2)设Sj-CLOSURE(S),且Sj Sk,则Sk-CLOSURE(S); (3)有限地使用规则(2)所得的集合为-CLOSURE(S). 例,在上页的NFA中, -CLOSURE(0)=0,1,2,3 -CLOSURE(1)=1 -CLOSURE(2)=2,3 -CLOSURE(3)=3. 进一步,-CLOS

42、URE还可定义在 -CLOSURE:(K)(K),设QK (Q(K),则,77,转换函数f的拓广,利用-CLOSURE(S),可定义f如下:,78,f与f的区别,由f的定义可知,f(S,a) 与f(S,a) 不同,f(S,a)是从S出发经过路径a据达的状态集(可走若干步);而f(S,a)是从S出发经过矢线a所达状态之集(只走一步) 其实,f(S,a) -CLOSURE(f(S,a) f(S,a) 只走一步a矢线 | 多步,第一步必须走a矢线 | 路径a :第一步可以是矢线 例如,在前面的NFA中, f(0, )= -CLOSURE(0)=0,1,2,3 f(0, )=1,2 f(0,a)=0,

43、1,2,3 f(0,a)=0 -NFA的接受集: L(M)=w|f(S0,w)Z,79,-NFA的用途:构造更复杂的FA,有了-NFA,就可把识别各种不同单词的FA用矢线(并连)连接起来,组成一个单一的NFA,经确定化后可得识别所有单词的DFA,由此可设计编译程序的词法分析器。 例如,某语言的单词有: 1.BEGIN 2.END 3.IF 4.THEN 5.ELSE 6.标识符 7.无符号整数 8. 12. 13.= 我们可容易地分别构造出识别各类单词的FA,然后将其合并为一个大FA,如书中P65图3-11所示(由于较难描绘,这里略去,请自行参阅教材),80,闭包,状态集I的_CLOSURE(

44、I) 如果q属于I q属于_CLOSURE(I) 从q出发经任意条弧到达的任何状态q都属于_CLOSURE(I),81,具有 动作的NFA的确定化,设已给具有动作的NFA M=(K,f,S0,Z),构造相应的DFA M=(K, ,f,q0,Z)的方法是,先令q0=-CLOSURE(S0), 然后对每个a,令 -CLOSURE(f(q0,a)为新状态,如此反复,直到无新状态产生: 1. 令 K=-CLOSURE(S0); f= ; 2. 对K中尚未被标记的状态qi=Si1,Si2,Sim:(1)标记qi;(2)对于每个a,令Ta=f(Si1,Si2,Sim,a); qj= -CLOSURE(Ta

45、);(3)若qjK,则令K=Kqj ;(4)令f=f f(qj ,a)= qj ; 3. 重复2.,直到K中无未标记的状态; 4. 令Z=qj | qj Z (这里把qj 视为集合),82,确定化具有动作的NFA的例子,例3.4 考虑前面引入的具有动作的NFA的例子(P63图3-10) 1.q0=0,1,2,3=K; 2.q0未标记,故(1)标记q0; (2)令f”(q0,a)= -CLOSURE(f(q0,a) =q0;f”(q0,b)= -CLOSURE(f(q0,b)=1,3=q1;q1=K;f”(q0,c)=2,3=q2; q2=K; 3. 此时,K=q0,q1,a2,q1,q2 are not marked.so,(1) mark q1; (2) let f”(q1,a)= -CLOSURE(f(q1,a)= ;f”(q1,b)=q1; f”(q1,c)= ; 4. q2 is not marked, so (1) mark q2; (2)f”(q2,a)= f”(q2,b)=; f”(q2,c)=q2; K is not increased and all states are marked. Z=q0,q1,q2,

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

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

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


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

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

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