View
36
Download
6
Category
Preview:
DESCRIPTION
第 2 章主要内容回顾. 文法的定义 : G =( V T ,V N ,P,S ) 推导与归约 : 最左推导(左句型、最右归约) 最右推导(右句型、规范句型、规范(最左)归约) 语法树 二义性 (定义) 文法的分类 0 型文法(短语结构文法)、 1 型文法(上下文有关文法)、 2 型文法(上下文无关文法)、 3 型文法(正则文法). 第三章 词法分析. 本章主要内容:. 单词的描述工具(正规表达式与正规集) 状态转换图与基本符号的识别 有限自动机 词法分析器的设计与实现. 3.1 单词的描述工具. - PowerPoint PPT Presentation
Citation preview
23/4/19 第三章:词法分析 1
第 2章主要内容回顾
文法的定义:G =( V T ,V N ,P,S ) 推导与归约:
最左推导(左句型、最右归约) 最右推导(右句型、规范句型、规范(最左)归约)
语法树 二义性(定义) 文法的分类
0 型文法(短语结构文法)、 1 型文法(上下文有关文法)、2 型文法(上下文无关文法)、 3 型文法(正则文法)
23/4/19 第三章:词法分析 2
第三章 词法分析
单词的描述工具(正规表达式与正规集)
状态转换图与基本符号的识别 有限自动机 词法分析器的设计与实现
本章主要内容:
23/4/19 第三章:词法分析 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 。
23/4/19 第三章:词法分析 4
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 的符
号串组成的集合。
23/4/19 第三章:词法分析 5
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*| ε) 表示的是无符号数。
23/4/19 第三章:词法分析 6
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
23/4/19 第三章:词法分析 7
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
23/4/19 第三章:词法分析 8
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)* 为所求。
23/4/19 第三章:词法分析 9
3.2 状态转换图与基本符号的识别
状态转换图的引进: P63 通常,为了识别标识符,画出识别标识符的流程图如右图所示。现在引进“状态”这个概念,在开始状态下取得一个字母便处于标识符状态,如果后面取到的仍然是字母或数字,则继续处于标识符状态,直到不是字母或数字才离开标识符状态,根据此将其变成下面的图:
入口
字母?
取字符
字母?
数字?
出口
出口否
是
是
否是
否22letter
Letter,digit
33其它终态11
初态
状态转换图是为了识别正规文法的句子专门设计的有向图。它只包含有穷多个状态,即有穷多个结点。(除了终止状态结点不代表任何非终结符号外)每个状态结点都代表文法的非终结符号。状态之间用箭弧(或称有向边)连接。弧上的标记指明在射出弧的结点状态下可能出现的输入字符。
23/4/19 第三章:词法分析 10
3.2 状态转换图与基本符号的识别 状态转换图的构造: P64
构造方法: 对于右线形正则文法,状态转换图构造步骤如下: ① 以每个非终结符为状态结点,开始符号对应初态 S ; ②增设一个终态 Z; ③ 对于规则 A→aB ,画从状态 A 到 B 的弧,标记为 a ; ④ 对于规则 A→a ,画从状态 A 到终态 Z 的弧,标记为 a 。 例 3-4 ,为例 3 中所给的文法 G[S] 构造其转换图如下:
AAa
a
a,d
SS
初态d
ZZ 终态
a
S→ aAS→ aA→ aAA→ dAA→ aA→ d
23/4/19 第三章:词法分析 11
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→ S→ a1 A1 , A1 → → a2A2 , A2 → → a3A3,…, Ai → → ai+1Ai+1, An-1 → → anAn
所以有: S=> a1 A1=> a1a2A2 =>a1a2a3A3=>… =>a1a2a3…an
23/4/19 第三章:词法分析 12
3.3 有限自动机 确定的有限自动机 DFA M :
定义:状态图的形式化。见 P73 的 定义 3.1 。
确定的有限自动机 DFA M 是一个五元组,即 M = ( Σ, Q, q0, F, δ )其中: Σ : 字母表 Q : 有限状态集合 q0 : 初态 F Q : 终态集合 δ : Q Σ Q 的单值映射
23/4/19 第三章:词法分析 13
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
23/4/19 第三章:词法分析 14
3.3 有限自动机
例 3-5 中的 DFA 的状态图表示如下:
SS
a UU
VVb
a
b
b a a,b
QQQ
QUV
VQU
VUS
b a字符状态
0
0
1
0
δ(S,a)=U, δ(S,b)=V
δ(V,a)=U, δ(V,b)=Q
δ(U,a)=Q , δ(U,b)=V
δ(Q , a)=Q , δ(Q , b)=Q
矩阵表示如右:
23/4/19 第三章:词法分析 15
3.3 有限自动机 利用 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} 。
δ(S,a)=U, δ(S,b)=V
δ(V,a)=U, δ(V,b)=Q
δ(U,a)=Q , δ(U,b)=V
δ(Q , a)=Q , δ(Q , b)=Q
23/4/19 第三章:词法分析 16
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} 。
23/4/19 第三章:词法分析 17
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 ),整个图含有一个初态结和若干个终态结。
2Q
2Q
2Q
23
2Q
2Q
23/4/19 第三章:词法分析 18
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} 。与之对应的状态图表示如下:
00
a 33
11b
44a
b
22 a
a
a
,b
,b
,b
23/4/19 第三章:词法分析 19
3.3 有限自动机例 3-7 ,构造一个 DFA M,它接受字母表 {a,b,c} 上,以 a 或 b 开始的字符串,或以 c开始但所含的 a 不多于一个的字符串。满足此条件的状态转换图如下:
0
1
a b
b
c a
2 c
c
b
3 a
c
b 故: 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
23/4/19 第三章:词法分析 20
3.3 有限自动机 利用 NFA 对字符串的识别: P76 对于 Σ 上的任何符号串 ω∈ Σ* ,若存在一条从初态结到终态结
的通路,且在这条通路上的所有箭弧标记符号连接成的符号串恰好是 ω ,则称 ω 为 NFA 所识别。若 q0 ∈F,F为终态集,这时 q0
状态结既是初态结也是终态结,因而存在一条从初态结到终态结的 ε- 道路,此时空符号串 ε 可为 NFA 所接受。
具有 ε- 转移的非确定有限自动机: P78 。 若文法 G 中有形如 A B (相当于 A εB )或 A ε 时,在状态图
中会有从 A 出发标有 ε 的箭弧到 B 或终态结,也就是说转移函数应该有 δ(A , ε)= B ,据此将非确定的有限自动机 δ扩充为:
δ : Q× (∑∪ {ε} ) 的映射,而其它不变,这样所形成的非确定有限自动机为具有 ε- 转移的非确定有限自动机。此自动机与其它非确定有限自动机基本上是一样的,只是在识别 ω 时不理睬那些标记为 ε 的箭弧即可。
2Q
23/4/19 第三章:词法分析 21
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中的
任何状态经任意条 ε 弧而能到达的状态的集合。
23/4/19 第三章:词法分析 22
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}
ε
11 1010ε22
44b
a
ε00
33
55
66 77 88 99
ε
ε
ε
ε
a b b
ε
23/4/19 第三章:词法分析 23
3.3 有限自动机▲③ 具体转换步骤: ( 子集构造法)以下面的基于字母表 Σ={a,
b} 上的具有 ε-转移的非确定有限自动机M为例。
步骤 1 :以 I , Ia 、 Ib等为列做表,其中 I 列第一行的内容是初态的
ε- 闭包所得到的状态集合。并以此为 I 计算 Ia 、 Ib等,而 且在所计算出的 Ia 、 Ib等中若有新的状态集产生,就重复 以此新的集合为 I 再此计算 Ia 、 Ib等,直到在所得的 Ia 、 Ib等中不再产生新的状态集为止。
ε11 yy
33
44b
a
εxx 55 22 66
ε
bb
a a
a
ε
b
23/4/19 第三章:词法分析 24
3.3 有限自动机
步骤 1 后的结果如下:I Ia Ib
{x,5,1}
初态的 ε-闭包
{5,1,3}
{5,1,4}
{5,1,3,2,6,y}
{5,1,4}
{5,1,3}
{5,1,4,2,6,y}
{5,1,3,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,4,2,6,y}
{5,1,3,2,6,y} {5,1,4, 6,y}
{5,1,4,2,6,y}
{5,1,4}
{5,1,3,2,6,y}
{5,1,3}
{5,1,4, 6,y}
{5,1,3, 6,y}
ε11 yy
33
44b
a
εxx 55 22 66
ε
bb
a a
a
ε
b
23/4/19 第三章:词法分析 25
3.3 有限自动机
步骤 2 :在上表中将原 NFA 初态的 ε- 闭包作为转换后的 DFA的初态,包含原 NFA 终态的状态作为转换后的 DFA 的终态,并进行重新编号得到转换后的 DFA 的状态转移矩阵如下:
a b
{x,5,1} 1 {5,1,3} 2 {5,1,4} 3
{5,1,3} 2 {5,1,3,2,6,y}4 {5,1,4} 3
{5,1,4} 3 {5,1,3}2 {5,1,4,2,6,y} 5
{5,1,3,2,6,y} 4 {5,1,3,2,6,y}4 {5,1,4, 6,y} 6
{5,1,4,2,6,y} 5 {5,1,3, 6,y} 7 {5,1,4,2,6,y} 5
{5,1,4, 6,y} 6 {5,1,3, 6,y} 7 {5,1,4,2,6,y} 5
{5,1,3, 6,y} 7 {5,1,3,2,6,y} 4 {5,1,4, 6,y} 6
0
0
0
1
1
1
1
包含原终态的状态作为新的终态
23/4/19 第三章:词法分析 26
3.3 有限自动机
步骤 3 :画出转换后的 DFA 的状态图:
11
a 22
33b
44a
b
55
b a a
77a
a b
a
66b
b
b
23/4/19 第三章:词法分析 27
3.3 有限自动机 正规文法与有限自动机的等价性(证略):通过前面引
入有限自动机概念时我们看到正规文法 G 所用以识别句子的状态转换图就是某个有限自动机的状态转换图。这就是说正规文法 G 所产生的语言和某个有限自动机M所识别的语言是相同的,此时称 G 和M是等价的。
等价性:对于任何一个正规文法,都存在一个 FA M,使 L(M) =L( G ),反之亦然。见书中 P82~87 内容。
有限自动机与正规表达式的等价性: Σ 上的符号或空或经过连接、闭包所得的为正规表达式,而且可以看到,程序设计语言中的表达式(单词)大多数都可通过正规表达式比较清晰、方便地表示出来。
23/4/19 第三章:词法分析 28
3.3 有限自动机 有限自动机与正规表达式的等价性:可以证明,对任何一个正规
表达式 r, 都存在一个 FA M ,使 L(M) =L( r) ,反之亦然。见书中 P87 的定理 3.5 。结合正规文法与有限自动机的等价性,我们可以看到正规文法、正规表达式、有限自动机这三者之间在某种意义下是互相等价的。也就是说,字母表 Σ 上的一个正规语言,既可以由某一个正规文法产生,也可以由某一正规表达式所表示,还可以由某一个有限自动机所识别,甚至还可以由某一个确定的有限自动机所识别。可根据需要在不同的情况采取不同的表达语言的方法。一般是正规表达式 → NFA→ DFA 。
对于 Σ 上的一个正规式 r 构造与之等价的 NFA M : (这里要把状态图的概念拓广,令每条弧可用一个正规式作标记。)
23/4/19 第三章:词法分析 29
3.3 有限自动机
具体转换步骤:步骤 1 :规定 r 与 等价,其中 x 为 NFA 的初态, y 为终态。 步骤 2 :按以下三条规则将弧上的正规表达式逐渐分解直至分 解为单个的字符或空为止。规则① 等价为
规则② 等价为
规则③ 等价为
xx yyr
iiAB
jj iiA
kk jjB
iiA|B
jj ii jj
A
B
iiA*
jj ii ε kk jjε
A
23/4/19 第三章:词法分析 30
3.3 有限自动机
例 3-8 ,构造与正规表达式 (a|b)*(aa|bb)(a|b)* 等价的 NFA M:首先: (a|b)*(aa|bb)(a|b)* 等价为
等价为
等价为
等价为
xx yy(a|b)*(aa|bb)(a|b)*
xx yy(a|b)*
11 22(aa|bb) (a|b)*
ε
a|b
ε
xx yyε
11 2255 66
aa
bb
ε
a|b
b
ε
xx yy11 2255 66ε
33
44b
a a
b b
εa a
ε
23/4/19 第三章:词法分析 31
3.3 有限自动机 对于 Σ 的一个 NFA M 构造与之等价的正规式:步骤 1 :在M的状态图上加两个状态结,一个为 x 结点,一个为 y 结点。从 x 结点用 ε 连接到M的初态,从M的所有终 态结点用 ε 弧连接到 y 结点,形成只有一个初态和一个 终态的M’。步骤 2 :使用以下三条规则逐步消去M’中的所有结点,直至只 剩下 x 和 y 结点,这时在 x 和 y之间箭弧上的标记即为所求。规则① 等价为
规则② 等价为
规则③ 等价为
iiAB
jjiiA
kk jjB
iiA|B
jjii jjA
B
iiAC*B
jjii A kk jjB
C
上述两规则的逆
更具一般性
23/4/19 第三章:词法分析 32
3.3 有限自动机
例 3-9 ,为以下图所表示的 NFA M构造与之等价的正规式 r :
增加结点 x 和 y 后形成新的 M’ 的状态转换图如下:
0044
11
33a
a,b
b
a
22b
a,b
a,b
ε00
44
11
33aa,b
b
a
22b
a,b
a,b
xx yy
ε
ε
23/4/19 第三章:词法分析 33
3.3 有限自动机
使用上述三条规则逐渐消去 M’ 中的所有结点后:
ε00
a,b
bb
aaxx
44
22
a,b
a,b
yy
ε
ε
ε00
a,b
bb(a|b)*
xx yyaa(a|b)*
(a|b)*(aa(a|b)*|bb(a|b)*)xx yy
即 r=(a|b)*(aa(a|b)*|bb(a|b)*)=(a|b)*(aa|bb ) (a|b)* 为所求。
23/4/19 第三章:词法分析 34
3.3 有限自动机 DFA 的化简(最小化):
化简条件:接受的语言必须相同。 化简 ( 最小化 ) 算法基本思想——划分法:1. 将 DFA M 中的状态划分为互不相交的子集,每个子集内部
的状态都等价;而在不同子集间的状态均不等价。2.从每个子集中任选一个状态作为代表,消去其它等价状态。3.把那些原来射入其它等价状态的弧改为射入相应的代表状态。 等价状态:设 DFA M中有两个状态 s,t1.s,t 等价:如果从状态 s出发能读出某个字串 ω而停于终态,从 t出发也能读出同样的字串 ω而停于终态,则称 s,t 等价。
2.s,t 可区别:如果 s,t不等价,则称为 s,t可区别。
23/4/19 第三章:词法分析 35
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 。
23/4/19 第三章:词法分析 36
3.3 有限自动机
例 3-10 ,设有一 DFA 的状态转换图如下,试化简之。
0
1
2
3
5
4
6
a a
a a
a
a a
b b
b b
b
b
b
∏1 = {{0,2} , {1}}
解: 1. ∏= {∏1 , ∏ 2 }={{0 , 1 , 2} , {3 , 4 , 5 , 6}} 2. 考察子集∏ 1 = {{0 , 1 , 2}}由 δ(0,a)=1 δ(1,a)=3 δ(2,a)=1
23/4/19 第三章:词法分析 37
3.3 有限自动机 再由δ(0,b)=2 δ(2,b)=5 ∏1 = {{0},{1},{2}}
接着考察子集∏ 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
∏2 不可再分,即 ∏2 = {{3 , 4 , 5 , 6}}
所以,最终∏= {{0} , {1} , {2} , {3 , 4 , 5 , 6}}3. 令状态 3 代表 {3,4,5,6} ,把原来到达状态 4 , 5 , 6 的弧都指向 3 ,并删除 4 , 5 , 6 。得:
2
a
b
1
3 0
a a
a
b b b
0
1
2
3
5
4
6
a a
a a
a
a a
b b
b b
b
b
b
23/4/19 第三章:词法分析 38
课堂练习(作业)课上练习 1 :将下图中的 DFA 最小化。
∏1 = {{A,B} , {F}}此时 {A , B} 是否可分取决于 C和 D是否等价。
解: 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 F D
EC
a
b a
a
a
b b
b
b
b
G
23/4/19 第三章:词法分析 39
课堂练习(作业)
再由δ(C,b)=E δ(D,b)=F
接着考察子集∏ 2 = {C,D,E,G},由于δ(C,a)=δ(D,a)=δ(G,a)=δ(E,a)=G
∏2 = {{C, D, G} , {E}}
所以,最终∏= {{A} , {B} , {C} , {D, G} , {E} , {F}}3. 令状态 D 代表 {D , G} ,把原来到达状态 G 的弧都射向 D ,并删除 G ,得:
∏2 = {{C} , {D, G} , {E}}并由此可知∏ 1 = {{A}, {B} , {F}}
a B D
A
a
b b
a
C b
a
E
F a
b
A
B F D
EC
a
b a
a
a
b b
b
b
b
G
23/4/19 第三章:词法分析 40
课堂练习(作业)
课上练习 2 :设计一个 DFA ,其输入字母表是 {0 , 1} ,它能接受以0 开始以 1 结尾的所有序列。解: ( 1. )根据题意,得到相应的正则式: 0 ( 0|1 ) *1 ( 2. )构造其 NFA 如下:
S A 0 ε B
0 , 1
ε C Z 1
( 3. ) NFA确定化为 DFA (并换名):I0 I1
1 {S} 2{A , B ,C}
2{A , B , C} 3{B , C} 4{B , C, Z}3{B , C} 3{B , C} 4{B , C , Z
}
4{B , C, Z} 3{B , C} 4{B , C, Z}
23/4/19 第三章:词法分析 41
课堂练习(作业)
相应 DFA 的状态图如下为:
1 2 0 0 3
0
4 1
1
1 0
( 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}}
23/4/19 第三章:词法分析 42
课堂练习(作业)
再由δ(2,0)=3 δ(3,0)=3
这样,最终∏= {{1} , {2 , 3} , {4}}所以,最小化 DFA 的状态图如下:
状态 2 与状态 3 等价
S A 0
0
BB
1
0
1
故最终的 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
课后练习:请构造与正则式 r=(a*b)*ba(a|b)* 等价的状态最少的DFA 。
23/4/19 第三章:词法分析 43
课后作业
P993.123.13(a)
23/4/19 第三章:词法分析 44
3.4 词法分析器的设计 词法分析程序的任务:从左至右逐个字符对源程序进行扫
描,按照词法规则识别出一个个正确单词,并转换为相应的二元式(种别,属性值)形式,交给语法分析使用。另外,词法分析程序除了识别出单词及其属性外,往往还要完成那些在语法分析之前需要做的工作,如删除注解、空格、换行符等非必要信息,把标识符登录到符号表及其某些预加工处理等。
词法分析词法分析
表格管理表格管理
语法分析语法分析源程序
单词
符号表常数表
23/4/19 第三章:词法分析 45
3.4 词法分析器的设计 词法分析程序的输出:词法分析程序的输出通常表示成二
元式(种别,属性值)的形式,其中,常用单词种别有: 各关键字(保留字、基本字),各种运算符,各种分界符——各用一个种别码标识
其它标识符——用一个种别码标示 常数——用一个种别码标示而单词符号的属性值是指反映单词符号特性或特征的值。常用单词属性值有: 常数的值,标识符的名字等 保留字、运算符、分界符的属性值可以省略
23/4/19 第三章:词法分析 46
例 3-11: 单词符号序列while(*pointer!='\0'){pointer++;} while (WHILE , _ )( (SLP , _ )* (FETCH , _ )pointer (IDN , 符号表入口指针 )!= (RELOP , NE )'\0' (CONST , 0 )) (SRP , _ ){ (LP , _ )pointer (IDN , 符号表入口指针 )++ (INC , _ ); (SEMI , _ )} (RP , _ )
3.4 词法分析器的设计
23/4/19 第三章:词法分析 47
3.4 词法分析器的设计 词法分析程序设计为一个独立子程序的原因:词法分
析器可作为一个独立的子程序,但这并不意味着必须把词法分析作为独立的一遍。词法分析程序作为一个独立子程序的好处:1. 使整个编译程序的结构更简洁、清晰和条理化(简化语法
分析过程)。2. 编译程序的效率会改进。大部分的编译时间是花费在扫描
字符以把单词符号分离出来,把词法分析独立出来,可采用专门的读字符和分离单词的技术可大大加快编译速度。另外,由于单词的结构可用有效的方法和工具进行扫描和识别,进而可建立词法分析程序的自动构造工具。
3. 增加编译程序的可移植性。在同一个语言的不同实现中,或多或少地会涉及到与设备有关的特征,将这些置于词法分析程序中解决而不影响编译其它成分的设计。
23/4/19 第三章:词法分析 48
3.4 词法分析器的设计 词法分析中的缓冲技术:有时词法分析程序为了得到
某个单词符号的确切性质,只从该符号本身所含有的那些字符还不能作出判定,还需要超过该符号沿着程序字符流继续向前看若干个字符后才能作出确定分析,这就提出了设置输入缓冲器的必要性。特别是某些高级语言对关键字不加保护,单词间没有明确界符,要在上下文环境中识别单词,这时一定需要超前搜索。例如: FORTRAN中对“ IF” 的使用:
△ IF (5 .EQ. M) GOTO 50 △ IF=100 △ IF(100)=5 另外,对内存的操作比对文件系统要快。
23/4/19 第三章:词法分析 49
3.4 词法分析器的设计 词法分析程序的手工设计:
两步骤:1. 画框图:正规式 → NFA→ DFA→ 最小化的 DFA具体的是:① 写出该语言的词法规则。
②把词法规则转换为相应的状态转换图。 ③把各转换图的初态连在一起,构成识别该语言的自动机。 2. 由特殊的框图(即状态图)写出词法分析程序。
将状态转换图看作通常的程序框图,按如下方法写出相应的词法分析程序。对于状态图中的每一状态(代表一个非终结符号)构造一段代码,代码的功能为:
子集法子集法 化简化简
23/4/19 第三章:词法分析 50
3.4 词法分析器的设计①从输入串中读一个字符;②判断读入的字符与由此状态出发的哪条弧上的标记相匹配,
然后转至相匹配的那条弧所指向的状态;重复步骤 1 直至无法前进(即到达那样的一个状态,它所面临的输入字符没有后继状态。可能有三种情况:一是没有前进的道路,二是超出了最长字符限制,三是文件系统单词读完了)。然后判断所在的是否为终态,是则“吃进”的字符序列为合法的单词,否则回退,直至遇到回退中的第一个终态为止,此时所形成的为合法单词。
③均不匹配时便失败(不能到达正常出口)。
23/4/19 第三章:词法分析 51
3.4 词法分析器的设计 例题 3-12 ,设计能识别以下三条规则表示的单词的词法
分析程序。1. 三条规则:① a r1
② abb r2 ③ a*bb* r3 2.NFA: a
abb
a*bb*
11 a
22
4433 a
6655 b b
77 b
88
aa
bb
23/4/19 第三章:词法分析 52
3.4 词法分析器的设计3. 合并:
00 4433 a
6655 b b
77 b
88
aa
bb
a2211ε
ε
ε
4.DFA: I Ia Ib 到达终态时所识别的单词
{0,1,3,7} {2,4,7} {8}{2,4,7} {7} {5,8} a(r1)
{8} {8} a*bb*(r3)
{7} {7} {8}
{5,8} {6,8} a*bb*(r3)
{6,8} {8} abb
23/4/19 第三章:词法分析 53
3.4 词法分析器的设计
重新编号: a b0 1 2
1 3 4
2 2
3 3 2
4 5
5 2
0011
1100
11
11
23/4/19 第三章:词法分析 54
3.4 词法分析器的设计所得状态图为:
0033
11
b
b
b55
bb
a
22
a
b
a
b
44识别识别 rr
33
识别识别 rr11
识别识别 rr22
识别识别 rr33
5. 化简 :∏= {∏1 , ∏ 2 }={{0,3} , {1 , 2 , 4 , 5}}经过化简可得∏ ={{0} , {3} , {1} , {2 , 4 , 5}}但由于这样划分后所得的新状态 2 中包含了识别 r3 和 r2 的终态,一旦进入状态 2 后不知是构成了 r2还是 r3 ,所以可以识别的规则为单位进行重新划分为: ∏ ={{0} , {3} , {1} , {2 , 4} , {5}}
① a r1 ② abb r2 ③ a*bb* r3
23/4/19 第三章:词法分析 55
3.4 词法分析器的设计最终所得状态图为:
对输入串 aba… 的识别过程如下 :从初态 0 开始工作,当它扫描到第一个字符 a 时,进入状态 1 。然后,见到 b又进入了 2 ,但 2 对于后面的输入字符 a没有后继状态,因此不能继续前进,至此, DFA “吃进”两个字符 a 和 b ,经历了三个状态 0 , 1 , 2 。然后判断最后“吃进”的那个字符所处的状态 2 是否为终态,是则表明所识别的单词 ab就认为是属于 2 所指的那个词形 a*bb* 。假如 2 不是终态,那么就把最后“吃进”的那个字符 b退还给输入串,同时检查前一个状态 1 ,一旦“吃进”的字符都退还完了,就宣布失败。
0033
11
b
b
b
55
bb
a
22
a
b
a
b
识别识别 rr22
识别识别 rr11
识别识别 rr33
23/4/19 第三章:词法分析 56
3.4 词法分析器的设计 词法分析程序的自动生成:由专门的构造程序对用正规表
达式组成的程序设计语言的符号说明书进行处理,生成一些表,这些表描述了不同语言中单词符号的构成规则,由一个通用的扫描算法使用这些表,就能实现某特定语言的词法分析程序的功能。如 LEX实现就是词法分析程序自动构造的一例。 LEX 语言:用来描述词法分析程序的一组单词的正规式及其
相应的语义动作,称为 LEX语言。其由三部分组成:说明部分(变量说明、常量说明及类似于 identifier→letter(letter|digit)* 的正规式的定义)、转换规则(类似于
正规式 动作描述 P1 {action1} P2 {action2}
Pn {actionn})及 action 所需要的辅助过程(用 C语言书写的一些过程,被识别过程调用)。
23/4/19 第三章:词法分析 57
3.4 词法分析器的设计 词法分析程序的自动生成:
LEX 编译程序的构造 : Lex 的输入称为 Lex 程序,主要为定义好了的一些词法规则。 Lex 程序的输出是一个可以识别这些单词的 C语言子过程。其构造图如下:
LEXLEX编译系统编译系统
词法分析词法分析程序程序 LL
LEXLEX 源程序源程序 Lex.1Lex.1 词法分析程词法分析程序序 LL (( Lex.Lex.yy.c)yy.c)
输入符号串输入符号串 单词符号串单词符号串
23/4/19 第三章:词法分析 58
3.5 补充:某简易语言词法分析 程序的设计与实现
词法规则 单词种别 属性<标识符 >→<字母 >(<字母 >|<数字 >)* IDN 符号表入口
<无符号整数 >→ <数字 > (<数字 >)* NUM 数值
<赋值符 >→ := ASG 无
其它单词→字符本身 单词名称 无
词法规则的定义:
23/4/19 第三章:词法分析 59
3.5 补充:某简易语言词法分析 程序的设计与实现
<标识符 >→letter<标识符尾 ><标识符尾 >→ε|letter<标识符尾 >|digit<标识符尾 ><整数 >→digit <整数尾 ><整数尾 >→ε| digit<整数尾 > < 赋值号 >→:=<加号 >→+<等号 >→=…( 其它:实数、算术运算符、关系运算符、分号、括号等)
转换为正规文法:
23/4/19 第三章:词法分析 60
3.5 补充:某简易语言词法分析 程序的设计与实现
Letter,digit
letter( IDN ,入口)
digit digit
( NUM ,值)( ASG , _ )
=
:
+
( ADD , _ )+ ( INC , _ )
其它
转换为有限自动机:
23/4/19 第三章:词法分析 61
3.5 补充:某简易语言词法分析 程序的设计与实现
子程序 scan( ) 输入:字符流 输出:
Symbol: 单词种别 Attr: 属性(全局变量 attr )。
数据结构ch 当前输入字符token 输入缓冲区 ( 字符数组 )symbol 单词种别(子程序的返回值)attr 属性(全局变量 attr )
23/4/19 第三章:词法分析 62
3.5 补充:某简易语言词法分析 程序的设计与实现
子例程 isKeyword(token): 判别 token 是关键字? 返回关键字种别或 -1 Lookup(token): 将 token 存入符号表,返回入口指针 getchar(): 从输入缓冲区中读入一个字符放入 ch
23/4/19 第三章:词法分析 63
3.5 补充:某简易语言词法分析 程序的设计与实现
1. getchar()2. WHILE ch 是空格 // 跳过空格2.1 DO getchar();3. CASE ch of4. isdigit(ch) :4.1 ch→token; getchar();4.2 WHILE isdigit(ch) DO ch→token; getchar();4.3 输入指针回退一个字符;4.4 将 token 中的字符串变成数值→ attr4.5 返回 NUM
实现算法:
23/4/19 第三章:词法分析 64
5. isalpha(ch) :5.1 ch→token; getchar();5.2 WHILE isalpha(ch) OR isdigit(ch) DO ch→token; getchar();5.3 输入指针回退一个字符 ;5.4 key = isKeyword(token);5.5 IF key≥0 THEN 返回 key5.6 Lookup(token)→attr;5.7 返回 IDN6 ':' : getchar(); 6.1 IF ch 等于 '=' THEN 返回 ASG6.2 出错处理
3.5 补充:某简易语言词法分析 程序的设计与实现
23/4/19 第三章:词法分析 65
7 '+' : 返回 ADD8 '-' : 返回 SUB9 '*' : 返回 MUL10 '/' : 返回 DIV11 '=' : 返回 EQ12 '>' : 返回 GT13 '<' : 返回 LT14 '(' : 返回 LP15 ')' : 返回 RP16 ';' : 返回 SEMI17 其它 : 出错处理18 END OF CASE
3.5 补充:某简易语言词法分析 程序的设计与实现
23/4/19 第三章:词法分析 66
3.5 补充:某简易语言词法分析
程序的设计与实现 缓冲区预处理,超前搜索 关键字的处理,符号表的实现 Lookup :查找效率,算法的优化实现 词法错误处理 由于高级语言的词组成集合为 3 型语言,所以,这里讨论的词法
分析技术可以用于处理所有的 3 型语言,也就是所有的可以用 3型文法描述的语言。如:信息检索系统的查询语言、命令语言等。
需要说明的问题:
23/4/19 第三章:词法分析 67
本章总结 词法从组成源程序的字符行中寻找出单词,并给出它们的种别和属性——输出二元组序列
高级语言的单词组成一个 3 型语言 3 型语言可以用正规表达式 RE 、正规文法 RG 、有限自动机 FA
描述 有限自动机 FA 的状态转移图,可以被用来指导相应的词法分析器
的实现 3 型语言相应的理论指导人们构造出了高级语言的词法分析器的
自动生成器——如: Lex 词法分析程序的设计步骤:正规表达式 正规定义式(正规文法) 状态图识别过程的实现算法 程序实现和测试
23/4/19 第三章:词法分析 68
习题 P97 练习 3.1 ~ 3.2 ; 3.3,3.4 选做 练习 3.5 ~ 3.13—— 有能力者可以完成 1 )构造下列正规式的状态图
a ( ( a | b )* | a b* a )* b 2 )给出下述文法所对应的正规式
S → 0 A | 1 B A → 1 S | 1 B → 0 S | 0
23/4/19 第三章:词法分析 69
习题 3 )文法 G[< 单词 >] 为:
< 单词 > → < 标识符 > | <整数 >< 标识符 > → < 标识符 > < 字母 > | < 标识符 > < 数字 > | < 字母>
<整数 > → <整数 > < 数字 > | < 数字 >< 字母 > → A | B | … | Y | Z< 数字 > → 1 | 2 | … | 8 | 9 | 0将该文法改写为正规文法
4 )上机题 合并例 3-3 和例 3-4 的状态图,设计并实现一个词法分析函数,
每次返回一个单词种别和属性;编制主程序完成测试(输入和输出)。
Recommended