编译原理-第三章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2.4 自动机的等价性
❖定义3.2 M和M是等价的,当且仅当对每一个串x,
M接收x当且仅当M接收x。
❖定义3.3 如果M仅通过重新标记它的状态就能转
换称M,则M和M称为同构的(Isomorphic)。 ❖FSA的一个基本定理是:对每一个自动机M,存在一 个等价的具有最少状态个数的自动机M,而且对于每 一个其状态个数与M相同且等价于M的自动机M″,必 是与M同构的。换句话说,M在结构上是唯一的。
❖例 图(a)所示的是一个NDFSA,结点q0是开始状态,q3是终止状态, 结点q0、q1与q4形成一个空移环路。要消除这个空移环路,只需将3个 结点q0、q1与q4合并成一个结点,以q0标记,并消除原来3个结点之间 所有的环。由于这3个结点中的q0是开始状态,因此,合并之后的新 结点q0被设置为开始状态,如图(b)所示。
(a) 令t(p1,a)∪t(p2,a)∪…∪t(pn,a)={Q1, Q2,…, Qr}。也就是将状态p1, p2,…, pn分别面临输入符号a时所确定出的状态统统汇集起来并取名为Q1, Q2,…, Qr。 (b) 置t([p1, p2,…,pn],a)=[Q1, Q2,…, Qr]。注意,这是一个确定的转换 函数。即M中的状态[p1, p2,…,pn]面临输入符号a时恰好确定出下一状态[Q1, Q2,…, Qr]。
3.2.5 非有穷状态自动机
非确定有穷自动机与确定有穷自动机的主要区别有三: ❖1.NDFSA有一个开始状态集,而DFSA只有一个开始状态。 ❖2.NDFSA的映射是QQ的子集,是一个多值映射,而 DFSA的映射是QQ,是一个单值映射。 ❖3.NDFSA在没有扫描任何输入符号的情况下,也可以进 行移动,这种移动称为空移。我们用表示法:
3.3.6 消除不可达状态
❖在自动机中,从开始状态没有任何一条路径能达到的 状态称为不可达状态。由于不可达状态事实上是无用的, 因此可以删除它们。下面给出识别可达状态的算法。当 该算法终止时,每一个未标记的状态就是不可达状态。 ❖识别DFSA中可达状态的算法。
①标记开始状态S; ②给定任意标记过的状态P,如果对某个输入符号存在从状态 P到Q的转换,则标记每一个这样的状态Q;
3.3.3利用状态转换表消除空移
利用FSA的状态转换表,可以很容易地消除 空移。这种方法地基本步骤示: ❖首先,找出直接经由一个空移到达某个终态地所 有状态。每当找到这样一个状态,便将它标记终 态。 ❖然后,考虑消除与未被标记为终态的那些状态相 关的空移。对表中每一个具有射出ε连线的状态 继续按上述方式处理,直到状态转换表不再变动 为止。 ❖最后从表中删除ε列和没有任何元素的空行便得 到一个不含空移的状态转换表。
3.3.5确定化——造表法
❖③ 重复第二步,直至表中所有第二、第三列上的元素全 部再第一列出现为止。
因为M中的状态(子集)的个数是有限的,所以上述三 步必定在有限步内终止。
❖④ 将由上述过程得到的最终形式的表看作一个状态转换 表,即把其中第一列中的元素作为状态,把Ia ,Ib分别看 作是输入符号a,b,把其余信息看作是状态转换函数之值。 这个表唯一地刻画了一个确定的有穷状态自动机M,其初 态是该表第一行第一列的元素,其终态是该表中所有那些 含有原终态的元素。可以证明,这个DFSA M和NDFSA M是 等价的。
q1
a
q2
q0
a
b
b
a a
q0
q2
b
b
q4
q3
b (a)
b
q3
(b)
3.3.2消除空移
❖下面给出一个消除空移的算法。
给定从状态A到B的一个空移(即从状态A 到B经由连线的一个转换,换言之, t(A,)={…,B,…})。置t(A,)=,对每 个a和q,如果qt(B,a),则将q加到t(A,a)。 如果A是开始状态,则将B也加入开始状态集。 如果B是终止状态,则将A也加入终止状态集。
其中,Q是非空有穷状态集,其中的每个元素称为一个 状态; 是有穷输入字母表,它的每一个元素称为一个输入符 号; t是一个单值映射QQ,也称状态转换函数, t(q,x)=q意指:当现行状态为q,面临的输入符号为x时, 将转到下一状态q,q称为q的一个后继状态; q0Q称之为开始状态; FQ称为终止状态集,至少由一个终止状态组成。
❖ 构形(q0,ω)称为初始构形,其中q0是初始状态, ω是由该自动机可接收或拒绝的任何输入串。 构形(q, )称为终止构形,其中是空串, qF(终态集)。
❖ 自动机的移动(记为├)是从一种构形到另一种 构形的转换。
❖ 记号├+称为├的传递闭包;├*称为├的自反 闭包。 ├*表示“0次或多次移动”;├+表示 “一次或多次移动”。
3.3.7确定的有穷自动机的化简
一个DFSA M的状态化简过程就是把M的状态集 分划成一些不相交的子集,使得任何不同的两子集 的状态都是可区分的,而同一子集的任何两个状态 都是等价的。最后,从每个子集选出一个代表(代 表该子集),同时消去其它等价状态。
第三章 有穷自动机
本章介绍有关有穷自动机的基本概念 和理论以及正规文法、正规表达式与有穷 自动机之间的相互关系。
3.1 概述
❖有穷状态自动机(Finite-state Automata 或简称FSA)在 识别功能上与正规文法类等价,而且也等价于一个特 殊 类 型 的 语 言 产 生 器 —— 正 规 表 达 式 (Regular Expression)。因此许多简单的程序语言都可由FSA所识 别。事实上,它是描述词法的有效工具,也是进行词 法分析的主要理论基础。
❖⑤ 对M每一状态和每个输入符号a,重复步骤4。这个算法总是可以终止 的。因为虽然M中含有许多可能的状态子集,但其不同子集的最大个数是有
穷的。事实上,若M有a个状态,则M中最大可能的状态个数是(-1)。
3.3.5确定化——造表法
造表法是比子集法简单而有效的一种确定化方法。
❖定义3.5设NDFSA M=(Q, ∪{}, t, Q0, F),假定I是M中
t(q, )={某些状态的集合}将这种情况包括在状态 转换函数中。注意,甚至当输入串已经完全扫描完之后还 可能需要空移。
3.3 NDFSA到DFSA的转换
通过下述步骤可将一个NDFSA转换称 等价的DFSA: ❖① 寻找并消除空移环路; ❖② 消除余下的空移; ❖③ 确定化。
3.3.1 空移环路的寻找和消除
重复步骤②,直到不再有可标记的状态为止。
3.3.7确定的有穷自动机的化简
❖所谓确定有穷自动机M的化简是指:寻找一个状 态数必M少的确定的有穷自动机M,使得L(M)= L(M)。
❖定义3.7 假定q1和q2是M中的两个不同状态,
称q1和q2是等价的:如果从状态q1出发能扫描任 意同串一w个而串停w止 而于 停终 止态于,终那态么;从反状之态,亦q2出然发。也能扫描
3.3.7确定的有穷自动机的化简
❖③ 若πk+1≠πk,则用πk+1“替代”πk,重复②;否则,分划过程 终止,转④; ❖④ 得到化简后的DFSA M,其中 Q的状态数即最终分划πi的子组个数,取πi中每个子组中的一个状态 代表该子组构成Q。注意,此时,πi中的每个子组是不相交的,且任 何不同两个子组中的状态都是可区分的,而同一子组中的任何状态都是 等价的。 q0即πi中含q0的子组; F即包含F中任一状态的所有子组; ∑=∑; t即πi中子组到子组之间的变换(可能会合并一些连线); ❖⑤ 去掉不可达状态和无用状态,便得到最终化简后的DFSA M。
3.3.4 确定化——子集法
设NDFSA M=(Q, , t, Q0, F)是一个非确定有穷自动 机,它的语言(即它能接受的符号串集合)记为L(A)。那 么 , 一 定 可 以 构 造 一 个 和 它 等 价 的 确 定 有 穷 自 动 机 DFSA M=(Q,Leabharlann Baidu, t, q0, F),使L(A)=L(A)。构造如下: ❖ ① M的状态集Q是由M的状态集Q的所有子集组成的。 用[p1, p2,…,pi]表示Q的元素,其中p1, p2,…,pi是Q中 的状态。以后,我们总假定状态p1, p2,…,pi是按某种规 范顺序排列的。例如,对于子集{p1p2}={p2,p1},Q的状 态是[p1, p2]。 ❖ ② 若p是M的一个终态,则M中每一个包含p的状态[…, p,…]都是M的一个终态。
❖定义3.8 如果两个状态q1和q2不等价,则称这
两个状态是可区分的。
3.3.7确定的有穷自动机的化简
DFSA M的化简算法。
给定DFSA M=(Q, , t, q0, F),化简M的算法如下: ❖① 将Q划分为二组:F(终态组)和Q-F(非终态组),以构成初始分划 π0; ❖② 给定πk,用下述方法构造新的分划πk+1:
❖有穷状态自动机在计算机系统中的价值是很明显的, 它提供了一种逻辑地探测方式,去探测一些输入串是 否属于某种语言,也就是说,它可以作为一种语法检 查器(Syntax Checker)。
3.2 有穷自动机的形式定义
❖定义3.1 一个确定有穷自动机DFSA是一个五元
组 M=(Q, , t, q0, F)
for πk中的每一子组Gi do begin 2-1) 试图对Gi进行分划,使得状态s,t并入Gi的同一子组中 iffa∑, 有t(s,a)和t(t,a)都落入πk的同一子组中;否则,必须对Gi进行分划,使 得分划后的某个子组包含s,另一子组包含t; 2-2) 将经上述分划后的子组并入πk+1 end;
3.2.1 状态转换表
❖例3.1 有穷自动机 A=(Q, , t, q0,F) 其中,Q={ S,A,B,G,H},={+,-,·,d},S是开始 状态,终止状态集F={B,H},映射t:QQ由下表所
示的状态转换表给出。
符号
+
-
·d
状态
S
AAG
B
A
G
B
B
H
B
G
H
H
H
3.2.2 状态转换图
❖例3.2 有穷自动机A(记为DFSA A), A=(Q, , t,
3.3.4 确定化——子集法
❖③ 若S={S1, S2,…, Sj }是M的初态,则S=[S1, S2,…, Sj]是M的初态。 ❖④ 令[p1, p2,…,pn]是M中的一个状态,其中p1, p2,…,pn 是M中的一个 状态。对某个输入符号a,考虑M中的转换函数:t(p1,a),t(p2,a),…, t(pn,a) 根据这些转换函数,我们可按如下方法构造M中的转换函数t:
q0,F) 其中,Q={ q0, q1, q2, q3},={a, b},q0是
开始状态,终止状态集F={q0},映射t:QQ由下
图所示的状态转换图给出。
a
在图中,状态q0用双 圆圈标记,表明它是终止
q0
q1
a
状态;同时,用一个箭头
b
b
b
b
标记,表明它是开始状态。
a
q3
q2
a
3.2.3 构形和移动
状态集的一个子集,定义-closure(I)如下:
① 若qI,则q–closure(I); ② 若q-closure(I),q是由q出发经多条弧所到达的状态,则q -closure(I)。
❖定义3.6假定I是NDFSA M中状态集的一个子集,a,定义
=-closure(J) 其中J是所有那些可从子集I中的任一状态出发,经过一条a连 线(跳过a连线前的ε连线)而到达的状态(结)的全体。
3.3.5确定化——造表法
造表法的具体步骤:
假定给定的NDFSA M中仅含两个符号a,b。可用如下 方法将M确定化:采用造表的方式,该表的每一行有三列 (若中含有n个符号,则该表有n+1列),第一列记为I,第 二、三列分别记为Ia ,Ib 。 ❖① 置该表的第一行第一列为-closure(Q0),即一列包含 M初态集Q0 的ε-闭包。然后计算它的Ia 和Ib,分别填入第 二、三列上,一般,若某一行的第一列上的I已确定,便可 根据前述定义求出这一行的第二、第三列上的Ia 和Ib。 ❖② 检查Ia 和Ib,看它们是否已在表的第一列中出现,把 未曾出现者之一填入下一空行的第一列上,再计算该行的 第二、第三列上的Ia 和Ib。
3.2.5 非有穷状态自动机
❖定义3.4 一个非确定有穷自动机NDFSA是一个
五元组 NDFSA=(Q, , t, q0, F)
其中,Q是一个非空有穷状态集, 是一个非空有穷输入字母集, 映射t为QQ的子集(即t是一个多值映射), Q0Q是开始状态集, FQ是终止状态集。
❖同样的,NDFSA也可以用状态转换表和状态转换 图表示。