690 likes | 823 Views
第 2 章主要内容回顾. 文法的定义 : G =( V T ,V N ,P,S ) 推导与归约 : 最左推导(左句型、最右归约) 最右推导(右句型、规范句型、规范(最左)归约) 语法树 二义性 (定义) 文法的分类 0 型文法(短语结构文法)、 1 型文法(上下文有关文法)、 2 型文法(上下文无关文法)、 3 型文法(正则文法). 第三章 词法分析. 本章主要内容:. 单词的描述工具(正规表达式与正规集) 状态转换图与基本符号的识别 有限自动机 词法分析器的设计与实现. 3.1 单词的描述工具.
E N D
第2章主要内容回顾 • 文法的定义:G=(VT,VN,P,S) • 推导与归约: • 最左推导(左句型、最右归约) • 最右推导(右句型、规范句型、规范(最左)归约) • 语法树 • 二义性(定义) • 文法的分类 • 0型文法(短语结构文法)、1型文法(上下文有关文法)、2型文法(上下文无关文法)、3型文法(正则文法) 第三章:词法分析
第三章 词法分析 本章主要内容: • 单词的描述工具(正规表达式与正规集) • 状态转换图与基本符号的识别 • 有限自动机 • 词法分析器的设计与实现 第三章:词法分析
3.1 单词的描述工具 • 正规表达式与正规集的定义:正规表达式也称正规式,是用以描述单词符号的方便工具,也是表示正规集的工具。 • 正规表达式的定义:P52。设∑是一个字母表, ⑴ Φ是∑上的RE,L(Φ)=Φ; ⑵ ε是∑上的RE,L(ε)={ε}; ⑶ 对于a∈∑,a是RE,L(a)={a}; ⑷如果r和s是RE,L(r)=R,L(s)=S,则: r与s的“或”(r|s)是RE,L(r|s)=R∪S; r与s的“连接”(rs)是RE,L(rs)=RS; r的克林闭包(r*)是RE,L(r*)=R*。 ⑸ 只有满足⑴、⑵、⑶、⑷的才是RE。 第三章:词法分析
3.1 单词的描述工具 • 一个由正规表达式表示的语言称为一个正规集。 • 例3-1,令∑={a,b},则∑上的正规式和正规集的例子有: 正规式 正规集 a {a} a|b {a,b} ab {ab} (a|b)(a|b) {aa,ab,ba,bb} a* {ε,a,aa,aaa…}任意个a组成的串的集合 a|a*b {a,b,ab,aab,aaab…}含有符号串a和包括零个或多于零个的a后跟一个b的所有符号串形成的集合。 (a|b)* {ε,a,b,aa,ab,ba,bb,aaa…}所有含a和b的符号串组成的集合。 第三章:词法分析
3.1 单词的描述工具 • 两个正规表达式的等价:P54。如果两个正规表达式表示同样的语言,则称这两个正规式是等价的。如(a|b)与(b|a),(a|b)* 与 (a*b*)*都是等价的。 • 正规表达式的运算优先级和代数规律: P54 ①*高于“连接” 和| , “连接” 高于 | ②| 具有交换律、结合律 ③“连接” 具有结合律、和对|的分配律 ④( ) 指定优先关系.意义清楚时,括号可以省略 ⑤ε是“连接”运算的恒等元素。 • 程序设计语言中的单词都能用正规表达式来定义。比如,用l来代表字母,d代表数字, ∑={l,d},则r1=l(l|d)*表示的是标识符,r2=dd*则定义了无符号整数, r3=d*(.dd*| ε)(e(+|-|ε)dd*| ε)表示的是无符号数。 第三章:词法分析
3.1 单词的描述工具 • 正规式与正规文法 • ∑上的正规式到正规文法G转换(特指右线性正规文法): 方法:①令其中的VT= ∑; ②对于任何正规式r,选择S,生成S→r,然后按以下三条规则对S→r进行分解直到每个产生式最多含有一个终结符为止。并将S定为G的开始符号; ③若x和y都是正规式,对形如A→xy的产生式重写为:A→ xB和B→ y两产生式,其中B是新选择的非终结符; ④对形如A→ x*y的产生式,重写为:A→ xA和A→ y ⑤对形如A→ x|y的产生式,重写为:A→ x和A→ y 第三章:词法分析
3.1 单词的描述工具 例3-2,将r=a(a|d)*转换成相应的正规文法: 解:令S为文法的开始符号,首先形成S→a(a|d)*然后对其进行分解,得到S→aA和A→(a|d)*,再对后条规则重写为:A→(a|d)A和A→ε,最终形成的文法G为: S→aA A→aA A→dA A→ε • 将正规文法G转换成∑上的正规式:基本上是上述过程的逆过程,最后只剩下一个开始符号定义的产生式,并且该产生式的右部不含非终结符,则此产生式的右部为所求。其转换规则如下: 规则1:A→ xB,B→ y A → xy 规则2:A→ xA|y A → x*y 规则3:A→x,A→y A → x|y 第三章:词法分析
3.1 单词的描述工具 例3-3,将文法G[S]: S→ aA S→ a A→ aA A→ dA A→ a A→ d 转换为相应的正规表达式。 解:过程如下:S → aA|a A → aA|dA|a|d 可写为 A →(aA|dA)|(a|d)可写为 A→(a|d)A|(a|d)可写为 A→(a|d)*(a|d) 将其代入S可得: S → a(a|d)*(a|d)|a → a((a|d)*(a|d)| ε) → a(a|d)*即a(a|d)*为所求。 第三章:词法分析
入口 否 字母? 出口 是 取字符 是 字母? 否 Letter,digit 初态 是 数字? 1 3 终态 否 其它 letter 出口 3.2 状态转换图与基本符号的识别 • 状态转换图的引进:P63 通常,为了识别标识符,画出识别标识符的 流程图如右图所示。现在引进“状态”这个概念, 在开始状态下取得一个字母便处于标识符状态, 如果后面取到的仍然是字母或数字,则继续 处于标识符状态,直到不是字母或数字才离 开标识符状态,根据此将其变成下面的图: 状态转换图是为了识别正规文法的句子 专门设计的有向图。它只包含有穷多个状态, 即有穷多个结点。(除了终止状态结点不代 表任何非终结符号外)每个状态结点都代表 文法的非终结符号。状态之间用箭弧(或称 有向边)连接。弧上的标记指明在射出弧的 结点状态下可能出现的输入字符。 2 第三章:词法分析
a,d 初态 d a S A Z 终态 a a 3.2状态转换图与基本符号的识别 • 状态转换图的构造:P64 • 构造方法: 对于右线形正则文法,状态转换图构造步骤如下: ①以每个非终结符为状态结点,开始符号对应初态 S; ②增设一个终态 Z; ③对于规则 A→aB,画从状态 A 到 B 的弧,标记为 a; ④对于规则 A→a,画从状态 A 到终态 Z 的弧,标记为a。 • 例3-4,为例3中所给的文法G[S]构造其转换图如下: S→ aA S→ a A→ aA A→ dA A→ a A→ d 第三章:词法分析
3.2状态转换图与基本符号的识别 • 利用状态图识别句子的步骤如下: (ω=a1a2…an,ai∈VT) 1.从初态S出发,并自左至右逐个扫描ω中的各个字符,显然,在状态S之下所扫视的输入字符为a1,此时在结点S所射出的箭弧中寻找标记为a1的箭弧(如不存在,则表明有词法错误),读入a1,并沿箭弧所指的方向前进到下一个状态; 2.设在状态Ai的情况下,所扫视的输入字符为ai+1,在结点Ai所射出的各箭弧中寻找标记为ai+1的箭弧,读入ai+1,并过渡到下一状态Ai+1; 3.重复上面的过程,直到ω中全部字符读完且进入终态Z时,宣告整个识别结束,ω已被接受。 因为:S→ a1A1, A1 → a2A2, A2 → a3A3,…, Ai → ai+1Ai+1, An-1 → anAn 所以有:S=> a1A1=> a1a2A2 =>a1a2a3A3=>…=>a1a2a3…an 第三章:词法分析
3.3 有限自动机 • 确定的有限自动机DFA M: • 定义:状态图的形式化。见P73的 定义3.1。 确定的有限自动机DFA M 是一个五元组,即 M = (Σ, Q, q0, F, δ) 其中: Σ : 字母表 Q: 有限状态集合 q0: 初态 F Q: 终态集合 δ: Q Σ Q 的单值映射 第三章:词法分析
3.3 有限自动机 • 表示形式:①状态图:假定M有n个状态,m个输入符号,那么这个状态转换图含有n个状态结,每个状态结最多由m条箭弧射出与别的状态结相连接。准确地说,若转移函数对于q,q’∈Q及a ∈ Σ,有δ(q,a)=q’,则从q到q’有一条标记为a的箭弧。整个图含有唯一一个初态结和若干个终态结。 ②矩阵表示:一个DFA还可以用一个矩阵的形式来表示,该矩阵的行表示状态,列表示输入字符,矩阵元素表示在相应状态行和输入字符列下的新状态,即k行a列为δ(k,a)的值。用“ ”表示初态,否则第一行即是初态,相应终态行在表的右端标以1,非终态标以0。 • 例3-5,设DFA M=({a,b},{S,U,V,Q},S,{Q},δ)其中δ定义为: δ(S,a)=U, δ(S,b)=V, δ(V,a)=U, δ(V,b)=Q, δ(U,a)=Q ,δ(U,b)=V, δ(Q,a)=Q,δ(Q,b)=Q 第三章:词法分析
U a a S Q b a a,b b V b 字符 a b 状态 S U V 0 U Q V 0 V U Q 0 Q Q Q 1 3.3 有限自动机 δ(S,a)=U, δ(S,b)=V δ(V,a)=U, δ(V,b)=Q δ(U,a)=Q ,δ(U,b)=V δ(Q,a)=Q,δ(Q,b)=Q 例3-5中的DFA的状态图表示如下: 矩阵表示如右: 第三章:词法分析
3.3 有限自动机 δ(S,a)=U, δ(S,b)=V δ(V,a)=U, δ(V,b)=Q δ(U,a)=Q ,δ(U,b)=V δ(Q,a)=Q,δ(Q,b)=Q • 利用DFA对字符串的识别:P74 ①对于Σ 上的任何符号串ω∈ Σ*,若存在一条从初态结到终态结的通路,在这条通路上的所有箭弧标记符号连接成的符号串恰好是ω,则称ω为DFA所识别。或 ②若ω∈ Σ*, δ(q0,ω)=p,其中q0为DFA M的开始状态,p∈F,F为终态集,则称ω为DFA所接受(识别)。为了理解上述定义,扩充δ函数如P75上。即对任何a ∈Σ, q∈Q将δ扩张为: δ(q ,ε)= q δ(q ,ωa)= δ(δ(q ,ω) ,a) △用此定义试证:baab可为例5的DFA M所接受。过程: δ(S ,baab)= δ(δ(S ,b) ,aab)= δ(V ,aab)= δ(δ(V ,a),ab) = δ(U ,ab)= δ(δ(U ,a) ,b)= δ(Q ,b)=Q,Q属于终态,得证。 • DFA M所识别的语言:所能识别的符号串的全体,记为L(M)。 即L(M)={ω| ω ∈Σ*,若存在p∈ F , 使δ(q0,ω)=q}。 第三章:词法分析
3.3 有限自动机 • 非确定的有限(状态)自动机NFA M:在前面的从正则文法构造NFA的例子中,恰好从一个状态射出的弧的标记是两两不同的。但是,如果有两条规则A→aT1和A→aT2,那么从A到T1和T2的弧的标记都是a。此时,不能用DFA的映射来表示状态为A时,输入a时的后继状态。也就是说,当状态为A,输入为a时,这个转换图的下一步动作出现了不确定性。即此时映射函数已不是单值的而是多值函数( δ(A ,a)= T1, δ(A ,a)= T2)。这就要扩充确定有限自动机的概念。 • 定义:P75的定义3.2。 对定义的理解: ①这里,并不要求δ具有单值性,它可以把序偶(qi,ai)映射到Q的子集{qk1,qk2,…,qkn},即δ(qi,ai)={qk1,qk2,…,qkn}。 第三章:词法分析
3.3 有限自动机 ②的意义: 是Q的幂集,即Q中所有子集组成的集合。比如,Q={1,2,3}则 ={{ε},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}}有 个子集。 ③Q×∑ 表示映射到子集中的某一个,但并不是说某个子集(如{1,3})就是合法的状态,而只是说1和3都有可能,还需继续去试1还是3。 • 状态转换图的表示:一个含有n个状态,m个输入符号的NFA M,也可以形象地通过一张状态转换图来表示,这张图含有n个状态结,每个状态结可射出若干箭弧与别的状态结相连接。准确地说,如果δ(q ,a)= {q1,q2,…qk},则从q出发分别向q1,q2,…qk各射出一条标记为a的箭弧( q1,q2,…qk∈Q,a∈∑,k可以是0),整个图含有一个初态结和若干个终态结。 第三章:词法分析
a a 3 4 a a 0 b b 1 2 a 3.3 有限自动机 例3-6,一个NFA M=({a,b},{0,1,2,3,4},0,{2,4}, δ)其中 δ(0 ,a)= {0,3}, δ(0 ,b)= {0,1}, δ(1 ,b)= {2}, δ(2 ,a)={2},δ(2 ,b)= {2}, δ(3 ,a)= {4}, δ(4 ,a)= {4}, δ(4 ,b)= {4}。与之对应的状态图表示如下: ,b ,b ,b 第三章:词法分析
b b c a 0 2 3 c c a b c a 1 b 3.3 有限自动机 例3-7,构造一个DFA M,它接受字母表{a,b,c}上,以a或b开始的字 符串,或以c开始但所含的a不多于一个的字符串。满足此条件的状态 转换图如下: 故:DFAM=( {a,b,c},{0,1,2,3,}, 0,{1,2,3}, δ)其中: δ: δ(0,a)=1 δ(0,b)=1 δ(0,c)=2 δ(1,a)=1 δ(1,b)=1 δ(1,c)=1 δ(2,a)=3 δ(2,b)=2 δ(2,c)=2 δ(3,b)=3 δ(3,c)=3 第三章:词法分析
3.3 有限自动机 • 利用NFA对字符串的识别:P76 对于Σ 上的任何符号串ω∈ Σ*,若存在一条从初态结到终态结的通路,且在这条通路上的所有箭弧标记符号连接成的符号串恰好是ω,则称ω为NFA所识别。若q0∈F,F为终态集,这时q0状态结既是初态结也是终态结,因而存在一条从初态结到终态结的ε-道路,此时空符号串ε可为NFA所接受。 • 具有ε-转移的非确定有限自动机:P78。 若文法G中有形如A B(相当于A εB)或A ε时,在状态图中会有从A出发标有ε的箭弧到B或终态结,也就是说转移函数应该有δ(A ,ε)= B,据此将非确定的有限自动机δ扩充为: δ:Q×(∑∪{ε}) 的映射,而其它不变,这样所形成的非确定有限自动机为具有ε-转移的非确定有限自动机。此自动机与其它非确定有限自动机基本上是一样的,只是在识别ω时不理睬那些标记为ε的箭弧即可。 第三章:词法分析
3.3 有限自动机 • NFA DFA的转换:事实已经证明了不管是非确定的有限自动机M还是具有ε-转移的非确定的有限自动机M,都可以找到一个与之等价的确定有限自动机M’,使得L(M)=L(M’)。P76的定理3.1 ①转换思路:由M出发构造与之等价的M’的办法是M’的状态对应于M的状态集合,即要使转换后的DFA的每一个状态对应NFA的一组状态。该DFA使用它的状态去记录在NFA读入一个输入符号后可能到达的所有状态,也就是说,在读入符号串a1a2a3…an之后,该DFA处在这样一个状态,该状态表示这个NFA的状态的一个子集T,而T是从NFA的开始状态沿着某个标记为a1a2a3…an的路径可以到达的那些状态。 ②引进两个定义: (对状态集合I) △状态集合I的ε-closure(I):定义为一状态集,是状态集I中的任何状态经任意条ε弧而能到达的状态的集合。 第三章:词法分析
a ε ε ε 2 3 ε ε a b b 1 0 6 7 8 9 10 ε 4 ε 5 b ε 3.3 有限自动机 △状态集合I的a弧转换Ia:定义为一状态集,是指从状态集I出发先经过a弧后再经过若干条ε弧而能到达的状态的集合。可以写作: Ia= ε-closure(J),J=move(I,a),其中,J是从I中任一状态出发经过一条a弧到达的状态集合,记为move(I,a)。 △比如,对于以下状态图中: ε-closure({0})={0,1,2,4,7} 在这里设I={0,1,2,4,7},则因为有move(I,a)={3,8}=J,所以 Ia= ε-closure(J)= ε-closure({3,8})={1,2,3,4,6,7,8} 第三章:词法分析
a a a 3 a ε ε ε ε x 5 1 2 6 y 4 b b b b 3.3 有限自动机 ▲③具体转换步骤:(子集构造法)以下面的基于字母表Σ={a,b}上的具有ε-转移的非确定有限自动机M为例。 步骤1:以I,Ia、Ib等为列做表,其中I列第一行的内容是初态的 ε- 闭包所得到的状态集合。并以此为I计算Ia、Ib等,而 且在所计算出的Ia、Ib等中若有新的状态集产生,就重复 以此新的集合为I再此计算Ia、Ib等,直到在所得的Ia、 Ib等中不再产生新的状态集为止。 第三章:词法分析
a {5,1,3} {5,1,4} a a 3 a ε ε ε {5,1,3,2,6,y} ε x 5 1 2 6 y {5,1,4,2,6,y} 4 b b b b {5,1,4, 6,y} {5,1,3, 6,y} 3.3 有限自动机 步骤1后的结果如下: 初态的ε-闭包 {x,5,1} {5,1,3} {5,1,4} {5,1,4} {5,1,3} {5,1,3,2,6,y} {5,1,3,2,6,y} {5,1,4,2,6,y} {5,1,4,2,6,y} {5,1,4, 6,y} {5,1,3, 6,y} {5,1,4,2,6,y} {5,1,3, 6,y} {5,1,3,2,6,y} {5,1,4, 6,y} 第三章:词法分析
3.3 有限自动机 步骤2:在上表中将原NFA初态的ε-闭包作为转换后的DFA的初态,包含原NFA终态的状态作为转换后的DFA的终态,并进行重新编号得到转换后的DFA的状态转移矩阵如下: 0 0 0 1 包含原终 态的状态 作为新的 终态 1 1 1 第三章:词法分析
a b a 2 4 6 a b 1 b a a b a b b a 3 5 7 b 3.3 有限自动机 步骤3:画出转换后的DFA的状态图: 第三章:词法分析
3.3 有限自动机 • 正规文法与有限自动机的等价性(证略):通过前面引入有限自动机概念时我们看到正规文法G所用以识别句子的状态转换图就是某个有限自动机的状态转换图。这就是说正规文法G所产生的语言和某个有限自动机M所识别的语言是相同的,此时称G和M是等价的。 等价性:对于任何一个正规文法,都存在一个FA M,使L(M)=L(G),反之亦然。见书中P82~87内容。 • 有限自动机与正规表达式的等价性: Σ上的符号或空或经过连接、闭包所得的为正规表达式,而且可以看到,程序设计语言中的表达式(单词)大多数都可通过正规表达式比较清晰、方便地表示出来。 第三章:词法分析
3.3 有限自动机 • 有限自动机与正规表达式的等价性:可以证明,对任何一个正规表达式r,都存在一个FA M ,使L(M)=L(r),反之亦然。见书中P87的定理3.5。结合正规文法与有限自动机的等价性,我们可以看到正规文法、正规表达式、有限自动机这三者之间在某种意义下是互相等价的。也就是说,字母表Σ上的一个正规语言,既可以由某一个正规文法产生,也可以由某一正规表达式所表示,还可以由某一个有限自动机所识别,甚至还可以由某一个确定的有限自动机所识别。可根据需要在不同的情况采取不同的表达语言的方法。一般是正规表达式 → NFA→ DFA。 • 对于Σ上的一个正规式r构造与之等价的NFA M:(这里要把状态图的概念拓广,令每条弧可用一个正规式作标记。) 第三章:词法分析
r x y A* AB i i j j A B i k j A A|B i j i j i k j ε B ε A 3.3 有限自动机 具体转换步骤: 步骤1:规定r与 等价,其中x为NFA 的初态,y为终态。 步骤2:按以下三条规则将弧上的正规表达式逐渐分解直至分 解为单个的字符或空为止。 规则① 等价为 规则② 等价为 规则③ 等价为 第三章:词法分析
(a|b)*(aa|bb)(a|b)* y x (a|b)* (aa|bb) (a|b)* 1 2 y x aa ε ε ε ε 5 1 2 6 y x bb a|b a|b 3 a a a a ε ε ε ε 5 1 2 6 y x b b 4 b b 3.3 有限自动机 例3-8,构造与正规表达式(a|b)*(aa|bb)(a|b)*等价的 NFA M: 首先:(a|b)*(aa|bb)(a|b)*等价为 等价为 等价为 等价为 第三章:词法分析
AB i j A B i k j A|B i A j i j i k j A B B AC*B C i j 3.3 有限自动机 • 对于Σ的一个NFA M构造与之等价的正规式: 步骤1:在M的状态图上加两个状态结,一个为x结点,一个为 y结点。从x结点用ε连接到M的初态,从M的所有终 态结点用ε弧连接到y结点,形成只有一个初态和一个 终态的M’。 步骤2:使用以下三条规则逐步消去M’中的所有结点,直至只 剩下x和y结点,这时在x和y之间箭弧上的标记即为所求。 规则① 等价为 规则② 等价为 规则③ 等价为 上述两 规则的 逆 更具 一般性 第三章:词法分析
a a 3 4 a,b a,b 0 b b 1 2 a,b a,b a,b a a 3 4 ε ε x 0 y b b 1 2 ε a,b 3.3 有限自动机 例3-9,为以下图所表示的NFA M构造与之等价的正规式r: 增加结点x和y后形成新的M’的状态转换图如下: 第三章:词法分析
a,b a,b aa 4 ε ε x 0 y bb 2 ε a,b a,b ε x 0 aa(a|b)* y x bb(a|b)* y (a|b)*(aa(a|b)*|bb(a|b)*) 3.3 有限自动机 使用上述三条规则逐渐消去M’中的所有结点后: 即r=(a|b)*(aa(a|b)*|bb(a|b)*)=(a|b)*(aa|bb)(a|b)*为所求。 第三章:词法分析
3.3 有限自动机 • DFA的化简(最小化): • 化简条件:接受的语言必须相同。 • 化简(最小化)算法基本思想——划分法: 1.将DFA M 中的状态划分为互不相交的子集,每个子集内部的状态都等价;而在不同子集间的状态均不等价。 2.从每个子集中任选一个状态作为代表,消去其它等价状态。 3.把那些原来射入其它等价状态的弧改为射入相应的代表状态。 • 等价状态:设DFA M中有两个状态s,t 1.s,t等价:如果从状态s出发能读出某个字串ω而停于终态,从t出发也能读出同样的字串ω而停于终态,则称s,t 等价。 2.s,t可区别:如果s,t不等价,则称为s,t可区别。 第三章:词法分析
3.3 有限自动机 • 化简(最小化)算法: 1.把状态集Q划分为终态集和非终态集: ∏={{非终态},{终态}}。因为终态能识别,而非终态不能,所以它们是可区别的; 2.对每个子集中的任何一个状态对(p,q),若对每一个输入符号a∈∑,r= δ(p,a),s= δ(q,a)且r与s均等价,则易知p和q等价;若存在某个a∈∑使r和s可区别,则p和q可区别。以此将各子集继续分解,直至不能再分解为止。 3.在最终的由各子集组成的状态集合中,在每个子集中任取一个状态做“代表”,而删去子集中其余状态,并把射向其它等价状态的箭弧都改作射向这个做“代表”的状态结中。这样得到的状态转换图所对应的DFA M’就是接受L(M)的具有最少状态的DFA。 第三章:词法分析
a a b 3 4 1 a b a a a b b 0 b b a 2 5 6 b ∏1={{0,2},{1}} 3.3 有限自动机 例3-10,设有一DFA 的状态转换图如下,试化简之。 解:1.∏={∏1, ∏2 }={{0,1,2},{3,4,5,6}} 2.考察子集∏1 ={{0,1,2}}由δ(0,a)=1 δ(1,a)=3 δ(2,a)=1 第三章:词法分析
∏1={{0},{1},{2}} a • 接着考察子集∏2={3,4,5,6},由于 δ(3,a)=3 δ(3,b)=4 δ(4,a)=6 及 δ(4,b)=5 δ(5,a)=6 δ(5,b)=5 δ(6,a)=3 δ(6,b)=4 a b 3 4 1 a ∏2不可再分,即 ∏2={{3,4,5,6}} b a a a b b 0 b b a 2 5 6 1 a a a b 0 b 3 b a b b 2 3.3 有限自动机 再由δ(0,b)=2 δ(2,b)=5 所以,最终∏= {{0},{1},{2},{3,4,5,6}} 3. 令状态3代表{3,4,5,6},把原来到达状态4,5,6的弧都指向3,并删除4,5,6。得: 第三章:词法分析
a b b F D a B a b G A b b C a E b ∏1={{A,B},{F}} 此时{A,B}是否可 分取决于C和D是否 等价。 课堂练习(作业) 课上练习1:将下图中的DFA最小化。 解:1.∏={∏1, ∏2 }={{A,B,F},{C,D,E,G}} 2.考察子集∏1 ={{A,B,F}}由δ(A,b)=C δ(B,b)=D δ(F,b)= 第三章:词法分析
a b b F D a B a ∏2={{C,D,G},{E}} b G A ∏2={{C},{D,G},{E}} 并由此可知∏1={{A}, {B},{F}} b b C a E b B b D a a a A a a F b b b E C 课堂练习(作业) • 接着考察子集∏2={C,D,E,G},由于 δ(C,a)= δ(D,a)= δ(G,a)= δ(E,a)=G 再由δ(C,b)=E δ(D,b)=F 所以,最终∏= {{A},{B},{C},{D,G},{E},{F}} 3. 令状态D代表{D,G},把原来到达状态G的弧都射向D,并删除 G,得: 第三章:词法分析
0,1 ε ε 0 1 S Z A B C 课堂练习(作业) 课上练习2:设计一个DFA,其输入字母表是{0,1},它能接受以 0开始以1结尾的所有序列。 解: (1.)根据题意,得到相应的正则式:0(0|1)*1 (2.)构造其NFA如下: (3.)NFA确定化为DFA(并换名): 第三章:词法分析
0 0 0 1 1 0 1 4 2 3 1 课堂练习(作业) 相应DFA的状态图如下为: • (4.)DFA最小化: 解:1.∏={∏1, ∏2 }={{1,2,3},{4}} 2.考察子集∏1 ={{1,2,3}}由δ(1,1)= δ(2,1)=4 δ(3,1)=4 ∏1= {{1} ,{2,3}} 第三章:词法分析
0 S 1 A B 0 1 0 课堂练习(作业) 再由δ(2,0)=3 δ(3,0)=3 状态2与状态3等价 故最终的DFA设计为: M = (Σ, Q, S, F, δ)其中 Σ={0,1} Q={S,A,B} F={B} δ: δ(S,0)=A δ(A,0)=A δ(A,1)=B δ(B,0)=A δ(B,1)=B 这样,最终∏= {{1},{2,3},{4}} 所以,最小化DFA的状态图如下: 课后练习:请构造与正则式r=(a*b)*ba(a|b)*等价的状态最少的 DFA。 第三章:词法分析
课后作业 • P99 3.12 3.13(a) 第三章:词法分析
源程序 词法分析 语法分析 单词 符号表 常数表 表格管理 3.4 词法分析器的设计 • 词法分析程序的任务:从左至右逐个字符对源程序进行扫描,按照词法规则识别出一个个正确单词,并转换为相应的二元式(种别,属性值)形式,交给语法分析使用。另外,词法分析程序除了识别出单词及其属性外,往往还要完成那些在语法分析之前需要做的工作,如删除注解、空格、换行符等非必要信息,把标识符登录到符号表及其某些预加工处理等。 第三章:词法分析
3.4 词法分析器的设计 • 词法分析程序的输出:词法分析程序的输出通常表示成二元式(种别,属性值)的形式,其中,常用单词种别有: • 各关键字(保留字、基本字),各种运算符,各种分界符——各用一个种别码标识 • 其它标识符——用一个种别码标示 • 常数——用一个种别码标示 而单词符号的属性值是指反映单词符号特性或特征的值。常 用单词属性值有: • 常数的值,标识符的名字等 • 保留字、运算符、分界符的属性值可以省略 第三章:词法分析
例 3-11: 单词符号序列while(*pointer!='\0'){pointer++;} 3.4 词法分析器的设计 while (WHILE, _ ) ( (SLP, _ ) * (FETCH, _ ) pointer (IDN, 符号表入口指针) != (RELOP, NE ) '\0' (CONST, 0 ) ) (SRP, _ ) { (LP, _ ) pointer (IDN, 符号表入口指针) ++ (INC, _ ) ; (SEMI, _ ) } (RP, _ ) 第三章:词法分析
3.4 词法分析器的设计 • 词法分析程序设计为一个独立子程序的原因:词法分析器可作为一个独立的子程序,但这并不意味着必须把词法分析作为独立的一遍。词法分析程序作为一个独立子程序的好处: 1.使整个编译程序的结构更简洁、清晰和条理化(简化语法分析过程)。 2.编译程序的效率会改进。大部分的编译时间是花费在扫描字符以把单词符号分离出来,把词法分析独立出来,可采用专门的读字符和分离单词的技术可大大加快编译速度。另外,由于单词的结构可用有效的方法和工具进行扫描和识别,进而可建立词法分析程序的自动构造工具。 3.增加编译程序的可移植性。在同一个语言的不同实现中,或多或少地会涉及到与设备有关的特征,将这些置于词法分析程序中解决而不影响编译其它成分的设计。 第三章:词法分析
3.4 词法分析器的设计 • 词法分析中的缓冲技术:有时词法分析程序为了得到某个单词符号的确切性质,只从该符号本身所含有的那些字符还不能作出判定,还需要超过该符号沿着程序字符流继续向前看若干个字符后才能作出确定分析,这就提出了设置输入缓冲器的必要性。特别是某些高级语言对关键字不加保护,单词间没有明确界符,要在上下文环境中识别单词,这时一定需要超前搜索。例如:FORTRAN中对“IF”的使用: △ IF (5 .EQ. M) GOTO 50 △ IF=100 △ IF(100)=5 另外,对内存的操作比对文件系统要快。 第三章:词法分析
3.4 词法分析器的设计 • 词法分析程序的手工设计: • 两步骤: 1.画框图:正规式 → NFA→ DFA→ 最小化的DFA 具体的是: ①写出该语言的词法规则。 ②把词法规则转换为相应的状态转换图。 ③把各转换图的初态连在一起,构成识别该语言的自动机。 2.由特殊的框图(即状态图)写出词法分析程序。 将状态转换图看作通常的程序框图,按如下方法写出相 应的词法分析程序。对于状态图中的每一状态(代表一个非 终结符号)构造一段代码,代码的功能为: 子集法 化简 第三章:词法分析
3.4 词法分析器的设计 ①从输入串中读一个字符; ②判断读入的字符与由此状态出发的哪条弧上的标记相匹配,然后转至相匹配的那条弧所指向的状态;重复步骤1直至无法前进(即到达那样的一个状态,它所面临的输入字符没有后继状态。可能有三种情况:一是没有前进的道路,二是超出了最长字符限制,三是文件系统单词读完了)。然后判断所在的是否为终态,是则“吃进”的字符序列为合法的单词,否则回退,直至遇到回退中的第一个终态为止,此时所形成的为合法单词。 ③均不匹配时便失败(不能到达正常出口)。 第三章:词法分析