1.29k likes | 1.45k Views
第 4 章 词法分析. 4.1 词法分析程序的设计. 词法分析器. 词法分析是任何编译程序的第一步工作,因此编译程序都有完成词法分析的程序部分,称这种程序为 词法分析器 或 扫描器 。. 词法分析器的共同特点是把每个单词转换成其内部形式,称它为 符号 或 记号 (TOKEN) 。. 词 法 分 析 器. 语 法 分 析 器. charsequence. TOKEN. 词法分析器的功能可图示如下。其 charsequence 表示字符序列。. 词 法 分 析 器. charsequence. TOKEN sequence.
E N D
第4章 词法分析
4.1 词法分析程序的设计 词法分析器 词法分析是任何编译程序的第一步工作,因此编译程序都有完成词法分析的程序部分,称这种程序为词法分析器或扫描器。 词法分析器的共同特点是把每个单词转换成其内部形式,称它为符号或记号(TOKEN)。
词 法 分 析 器 语 法 分 析 器 charsequence TOKEN 词法分析器的功能可图示如下。其charsequence表示字符序列。
词 法 分 析 器 charsequence TOKENsequence
CLASS VAL TOKEN: 词法分析器的设计 TOKEN的通常结构是一个二元组: 其中CLASS示种类部分,VAL是值部分 TOKEN结构的一种方法可如下图,其中n是从4开始的编码,且一特殊符一码。
CLASS VAL NAMEL 标识符: 1 常整数: 2 CONSL 实常数: 3 特殊符: n 0
单词的识别 词法分析的关键之一是如何识别单词的问题,其中最重要的是标识符的识别问题。
4.2 单词的描述工具 定义2.1正则表达式 设Σ为给定字母表,RE表示Σ上正则表达式之集,则定义: 1.Λ,ε∈RE 2.若a∈Σ,则a∈RE 3.若e1,e2∈RE,则(e1|e2)∈RE,(e1e2)∈RE,(e1)*∈RE
例子: Σ={a,b} 正则式e L(e) b+ {b, bb, bbb…} b* {ε,b, bb, bbb…}
例子: (a|b)* {a,aa,ab,aaa…} (a|b)0 {ε} (a|b)1 {a, b } (a|b)2 =(a|b) (a|b) {aa,ab,ba,bb}
定义2.2设e∈RE,则定义函数L(e)如下: L(Λ)= L(ε)= {ε} L(a)={a} L(e*)= L(e)* L(e1|e2)= L(e1)∪L(e2) L(e1e2)= L(e1)L(e2)
定理2.1设e1 ,e2∈RE,则有: 1:L(e1|e2)=L(e2|e1) 2:L((e1|e2)|e3)=L(e1|(e2|e3)) 3:L((e1e2)e3)=L(e1(e2e3)) 4:L(e1(e2|e3))=L(e1e2|e1e3) 5:L((e1|e2)e3)=L(e1e3|e2e3) 6:L(εe1)=L(e1ε)=L(e1)
例子: 正则式e L(e) ab* {a,ab,abb,abbb…} ab+ {ab,abb,abbb…} a(a|b)+ {aa,ab,aaa…} a(a|b)* {a,aa,ab,aaa…}
a(a|b)* {a,aa,ab,aaa…} 标识符:<字母>(<字母>|<数字>)* 语法图 文法 正则式 →自动机→状态图→编程
例子:Σ={a,b} L(a*)={ε,a,aa…} L(ba*)={b,ba,baa…} L(a|ba*)={a,b,ba…} L(aa|bb|ab|ba)={aa,bb,ab,ba}
正则式e L(e) 1.ab* 1.∑上所有以a为首后跟任意多个(包括0个) b的字符串集 a(a|b)* 2.∑上所有以a为首的字符串集 例子:∑={a,b} 正则表达式所定义的集合,称为正则集。
4.3 确定自动机 4.3.1 确定自动机 自动机应用:广泛应用在人工智能,推理逻辑等领域。 无穷自动机 自动机 确定自动机 有穷自动机 非确定自动机 定义2.3确定自动机(DA)A是一个五元组 A=(S,∑,δ,s0,F)
S 是状态集{s0,s1,…,sn}(n≥1) • ∑是字母表{a1,a2,…,an}(n≥1) • δ是映射:S×∑→S,且为单值的 • s0是初始状态,s0∈S • F 是终止状态集,FS 每个DA均可用矩阵(状态转换矩阵)或状态转换图来表示。
a b +s0 s1 s2 s1 s1 _s2 s3 s0 _s3 s2 例子:A=(S,∑,δ,s0,F) S={s0,s1,s2 ,s3} ∑={a,b} F={s2,s3} δ(s0,a)=s1 δ(s0,b)=s2 δ(s1,b)=s1 δ(s2,a)=s3 δ(s2,b)=s0 δ(s3,a)=s2
b S1 a - + S3 S0 b a a b S2 - 状态转换图如下:
定义2.4设A=(S,∑,δ,s0,F) (1) s’ s’’,则s’ s’’ s’ s’’,s’’ s’’’,则s’ s’’’ (2) L(A)={β|s0 s’, s’∈F } a a a a 前一条表明自动机的推理作用,后一条表明其词法分析的作用。 如果β∈L(A),则称β可被A所接受。其中→表示映射,表示推导。
终止状态 开始状态 分界符 字母 0 1 2 字母或数字 例子:标识符的正则式: 字母(字母|数字)* 状态转换图如下: 可为每个状态设计一段处理程序,得出标识符的分析程序。
读入字符子程序 入口 N 是字母 Y N Y N 是字母|数字 出口 识别出一个标 识符后的处理 Y 是分界符 出错处理 读入字符子程序
转换矩阵 a b +s0 s1 s2 s1 s3 s2 s2 s1 s3 -s3 s3 s3 例子:FA=({s0,s1,s2,s3},(a,b),f,S0,{s3}) 其中映射f为: f(s0,a)= s1 f(s0,b)= s2 f(s1,a)= s3 f(s1,b)= s2 f(s2,a)= s1 f(s2,b)= s3 f(s3,a)= s3 f(s3,b)= s3
a|b S1 a a b a + S0 - S3 b b S2 状态转换图: 可以识别=aa,abaaa等。
4.3.2 非确定自动机 定义2.5 NDA 一个非确定自动机(NDA)A是一个五元组 A=(S, ∑,δ,S0,F) S 是状态集{s0,s1,…,sn}(n≥1)。 ∑是字母表{a1,a2,…,an}(n≥1)。 δ是映射:S×∑→S,不要求是单值的 S0是初始状态集(非空) F 是终止状态集,FS。
L(A)={|s0 S’ , s0∈S0, S’∈F} 定义2.6设A是一个NDAA=(S,∑,δ,s0,F),则定义: 定义2.7设A1和A2是同一字母表上的自动机,如果有L(A1)=L(A2),则称A1和A2等价。
例子:考虑下图所示的非确定自动机。 A2=(S,∑,δ,S0,F) S={0,1,2 } S0={0,1 } ∑={a,b} F={1,2} δ(0,a)={0,1} δ(0,b)={2 } δ(1,a)={ } δ(1,b)={1,2} δ(2,a)={1 } δ(2,b)={2 }
a b +0 {0,1} {2} -+1 {1,2} -2 {1} {2} b -+ 1 a b a a b 0 2 b + -
C a A B b D C a B b D 4.3.3 NFA转换为等价的DFA 定理2.2对于每一个非确定自动机A,存在一个确定自动机A’使得L(A)=L(A’)
证明:构造算法如下: 1.令A’的初始状态为s’0=[s10,s20,… s0k],其中s10,s20,…s0k是A的全部初始状态。 2.若I=[s1,…,sm]是A’的一个状态, a∈∑,则定义δ’(I,a)=Iaδ,其中δ为A的转换函数。 3.重复步骤2直至不出现新的状态I为止。
b b a + - S + P Z b b 例子:考虑下图所示的非确定自动机。 由不确定自动机A构造等价的确定自动机A‘过程如下图所示。
a b a b +[SP] [P] [SZ] +S P S,Z [P] [Z] +P Z -[SZ] [P] [SPZ] -Z P -[Z] [P] 非确定自动机A -[SPZ] [P] SPZ 确定自动机A’ 由上述表格可以得出确定自动机A’。 确定自动机如下图所示。
+ b a SP b - - a Z P SZ b - a b SPZ b 为方便,将扩充自动机使得在边上有ε符号。我们称这种自动极为ε-自动机。并记为εDA或εNDA。
1.首先找如下ε边,其中B没有ε输出边: 如果没有这样边,则转步骤4。 ε B A 定理2.3 对任给εDA均可构造一个DA,使得这两个自动机等价,既有L(εDA)=L(DA) 构造算法:
2.设B直接后继为B1,B2,…,Bn,且有: (1≤i≤n)则作下面工作: 2.1消除原ε边(节点保留): ai 2.2引进新边: Bi A ε B A ai Bi B 2.3如果B标有“-”,则给A标上“-”。 2.4如果存在一条从始点到A点的ε路,则给B标上“+”。
3.重复步骤2直至不出现步骤1所指的ε边为止。 4.如果还有ε边,则肯定有ε闭路。这时要把闭路中的点合并为一个点,边也作相应处理。
εa C a A B b D εb 情况一: C a ε A B b D 例子:下图是从εDA到DA的过程
情况二: - - - ε A B A B a C a 情况三: + + + A ε B A B A B b b D
情况四: + ε ε B S A + ε + B S A
ε 情况五: b a B S A ε b a S A
X 1 ε - + ε 1 S Z 1 0 Y 1 例子:下图是从εDA到DA的过程 转化过程如下:
X - 1 1 -+ + 1 ε Z S 1 0 Y 1 -+ X 1 +- +- 1 1 Z S 1 1 0 1 Y 1
0 1 +-SXZ Y SXY Y Z -SXY Y SXYZ -Z S -SXYZ Y SXYZ -S Y SXY 确定化:
3 2 a + 0 1 6 7 b 4 5 a 10 8 9 b b - 例子:求闭包,将εDA转化到DA
a b +{0,1,2,4,7} a {0,1,2,4,7} {3,8} ε-closure({3,8})={1,2,3,4,6,7,8} a b +{0,1,2,4,7}{1,2,3,4,6,7,8} ①计算ε闭包 ε-closure(0)={0,1,2,4,7}//由该状态出发经过ε边所达到的状态。
a b +{0,1,2,4,7}{1,2,3,4,6,7,8} {1,2,4,5,6,7} b {0,1,2,4,7} {5} ε-closure({5})={1,2,4,5,6,7}
a b +T0 T1 T2 T1 T1 T3 T2 T1 T2 T3 T1 T4 -T4 T2 ②转化为确定自动机: 转化如下: T0 ={0,1,2,4,7} T1 ={1,2,3,4,6,7,8} T2 ={1,2,4,5,6,7} T3 ={1,2,4,5,6,7,9} T4 ={1,2,4,5,6,7,10}
b 2 b b a + - a b b 0 1 3 4 a a a 转换后的DA图如下: