- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理ppt23
2.3 有限自动机 有限自动机、正规式描述语言能力的等价性 掌握有限自动机与正规式之间的相互转换 不确定有限自动机(Nondeterministic Finite Automata) 一个非确定有限自动机(NFA) M是一个五元式 M=(S,∑,δ,S0,F) 其中 (1) S有穷状态集; (2) ∑有穷字母表; (3) 转换函数δ是一个从S×(∑ ?ε)到S的子集的映照, 即δ: S ×(∑ ?ε)→2S (4) s0是唯一的初态或开始状态; (5) F?S,是一个终态集(可空)。 NFA的表示 用文字和公式描述 状态转换图 转换表:矩阵的行表示状态,列表示输入字符,矩阵元素表示δ(s,a)的值 例如识别语言(a|b)*ab的NFA (1) NFA M=({0,1,2},{a,b}, δ,0,{2}} δ(0,a)={0,1}, δ(0,b)={0}, δ(1,b)={2} (2)状态转换图 (3)转换表 对于∑*中的任何一个字α,若存在一条从某一初态结点到某一终态结点的通路,且这条通路上所有弧的标记字依序连接成的字(忽略那些标记为ε的弧)等于α,则称α可为NFA M所识别(读出或接受)。 L(M)={α| δ(s0,α)=P, P∩F≠Φ} 例:接受以ab结尾的a和b的字符串 分析识别串aabab的处理过程 识别aabab 例接受aa*|bb*的NFA 确定有限自动机(Deterministic Finite Automata) 对状态图进行形式化,则可以下定义: 一个确定有限自动机M是一个五元式M=(S, ?, δ, s0, F),其中: 1. S: 有穷状态集 2. ?:有穷字母表 3.δ: 状态转换函数,为S???S的单值部分映射,δ(s,a)=s’表示:当现行状态为s,输入字符为a时,将状态转换到下一状态s’。我们把s’称为s的一个后继状态 4. s0?S是唯一的一个初态 5. F?S :终态集(可空)。 DFA与NFA的区别 没有ε转换 从任何状态出发,对于任何输入符号,最多只有一个转换 DFA如何描述语言? 对于∑*中的任何字α,若存在一条从初态结点到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为DFA M所识别(读出或接受)。 如果存在状态序列S0,S1,…,Sn使得δ(S0,a1)=S1, δ(S1,a2)=S2,..., δ(Sn-1,an)=Sn,S0为初态,Sn为任一接受态,则称字符串a1a2…an被有限自动机M所接受。 若M的初态结点同时又是终态结点,则空字ε可为M所识别(或接受)。 DFA M 所能识别的字的全体记为L(M)。 一个输入串不被DFA M识别 读完输入串,状态不停在终止状态 在读过程中出现不存在的映射,使自动机无法继续动作 2.3.3 NFA到DFA的变换 DFA是NFA的特例 对于每个NFA M存在一个DFA M“,使L(M)=L(M”) (注:不对定理进行理论证明,只介绍一种算法(这种算法称为子集构造法),将NFA转换成接受同样的语言的DFA ) 子集构造法的中心思想: DFA的一个状态是NFA的一个状态集合 读了输入串a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} 要解决的两个主要问题 怎样处理NFA中的ε转移 怎么表示某个状态在读入字符以后进入的状态集合 关键运算 状态集合I的?-闭包,表示为?_closure(I),定义为一状态集,是状态集I中的任何状态S经任意条?弧而能到达的状态的集合。状态集合I的任何状态S都属于?_closure(I)。 若q?I,则q??_closure(I); 若q?I,则从q出发经过任意条?弧而能到达的任何状态q’都属于?_closure(I) 状态集合I的a弧转换,表示为Ia,定义Ia = ?_closure(J),其中J是所有那些可从I的某一状态经过一条a弧而到达的状态的全体,J记为move(I,a) 例 I={1} ε_closure (I)= I={5} ε_closure (I)= I={1,2} Ia= I={3,4,5} ε_closure (I)= I={2,5,6} Ia= 子集构造法 假定∑={a1,…,ak}。我们构造一张状态转换表,此表的每一行含有k+1列。置该表的首行首列为ε_CLOSURE(s0)。 如果某一行的第一列的状态子集已经确定,例如记为I,那么,置该行的i+1列为Iai(i=1,…,k)。然后,检查该行上的所有状态子集,看它们是否已在表的第一列中出现.将未曾出现者填入到后面空行的第
文档评论(0)