学习目标 | 1.明确词法分析在编译过程所处的阶段和作用 |
---|---|
2.理解一般的单词分类和构词规则 | |
3. 了解有穷自动机理论 |
3.1 词法分析程序的设计
(1)任务
① 主要任务
逐个字符地扫描源程序,识别单词符号(终结符)。在拼单词时作词法检查。每识别出一个单词,就翻译成相应的机内表示(语法分析时的终结符)。
② 删去注解、空格、续行符等
③ 插入某些信息
为了语法分析出错处理的错误定位,要 为源程序增加行号(在列表文件中可见)。
在支持宏处理功能的源语言中,可以由 词法分析程序完成其预处理等。
(2)实现方式
①相对独立方式
②完全独立方式
(3)单词类别及其输出形式
单词可作各种分类,典型地分为5类:
①保留字:AND,BEGIN,FOR,TYPE,VAR等(个数确定,可全体编为一类,称作“一符一类”)
②标识符:用户定义的常量名、变量名、过程名(个数不确定,作为一类)
③常量:12,1997,4.14,‘A’,‘scnu’等(个数不确定,按类型分类)
④运算符 +,-,*,/, >,>=,<,<=,#等(个数确定,“一符一类”)
⑤界限符 ;,()等(个数确定,“一符一类”)
词法分析程序输出的单词符号通常用二元式 表示:(单词种别,单词自身的值)
- 单词种别:表示单词种类,常用整数编码,它是语法分析需要的
- 单词自身的值:是编译中其他阶段所需要的信息
3.2 正则表达式(正则式)和正则集(正则语言) (简单了解)
定义3.1 正则式和正则集
在字母表V上定义的正则式及其描述的正则 集递归地定义如下:
(1)Φ是正则式,表示空集;
(2)ε是正则式,表示{ε};
(3)每个a∈V是正则式,表示{a};
(4) 若P和Q是正则式,分别表示正则集L§和L(Q),则
① P|Q是正则式,表示L§∪L(Q) “或”
② PQ是正则式,表示L§L(Q) “联结”
③ P是正则式,表示L§ “星闭包”
④ §是正则式,表示L§
(5) 仅由有限次使用上述步骤得到的正则式, 才是V上的正则式。运算的优先次序为:* . |
定义3.2 等价
对正则式P和Q,若L§=L(Q), 则P与Q等价,记为P=Q。
定理3.1 运算规则
对正则式P,Q,R,以下关系成立
(1) P|Q=Q|P “或”交换律
(2) P|(Q|R)=(P|Q)|R “或”结合律
(3) P(QR)=(PQ)R “联结”结合律
(4) P(Q|R)=PQ|PR “联结”对“或”的左分配律
(5) (Q|R)P=QP|RP “联结”对“或”的右分配律
(6) εP=Pε=P (7) ΦP=PΦ=Φ Φ|P=P|Φ=P
(2) 由正则文法构造正则式(3G->RE)
定理3.2 正则文法规则
U→a1W1|a2W2|…|anWn|b1|b2|…|bm 的等价正则式方程为其中
U=(b1+b2+…+bm)+a1W1+a2W2+…+anWn 其中Wi是正则变量
(非重点不展开)
3.3 有穷自动机(FA)
3.3.1 确定有穷自动机(DFA)
定义3.5 一个确定有限自动机(DFA)M是一个 五元组:M=(K,VT,f,S,Z) 其中
K:有穷状态集;
VT:有穷的输入字母表;
f:K×VT→K是状态转换函数,即f(W,a)=U 表示当前状态W下,输入a时,转到状态U。
S:唯一的开始状态,S∈K;
Z:终止状态集,是K的非空子集。
“确定”即f是单值函数。
1.状态转移矩阵
一个DFA可用一个矩阵表示,该矩阵的行表示 状态,列表示输入字母,矩阵元素表示f(W,a) 的值,这个矩阵称状态转移矩阵。
2.状态图(SG)
一个DFA也可用状态图(SG)表示,该图中的结点表示状态,若有f(W,a)=U,则从状态结点 W到状态结点U画标记为a的弧。
3.关于DFA的基本概念:
定理3.4 若DFA上有一条从初态到终态 的路径产生x,则x为DFA所能识别的符 号串。
注意:若初态和终态是同一状态, 则表示ε为DFA所识别。
例:试判断符号串 aab是否是DFA所能 识别的。
显然,不能被识别的字符串有两种情况:
(1) 读完输入串,状态 不停在终态,例aa;
(2) 在读过程中出现不 存在的映射,使自动机 无法继续动作,例ab。
定义3.7 确定有穷自动机DFA的状态转换函 数f可扩充为:
g:K×VT*→K
特别地,g(W,ε)=W 对空串,状态不变
g(W,a)= g(f(W,a),ε)=f(W,a)
即,f有定义,则f与g一致。
g(W,a1a2)=g(g(W,a1),a2)=f(f(W,a1),a2) … … … g(W,a1a2 … an)=g(g(… g(g(W,a1),a2),…),an) =f(f(… f(f(W,a1),a2),…),an)
定义3.8 若x∈VT* 且 g(S,x)∈Z,则称x为 DFA所识别的字符串。
例:输入字符串aab g(A,aab)=g(g(A,a),ab) =g(B,ab)=g(g(B,a),b) =g(C,b)=D
定义4.9 所有DFA所能识别的字符串集合称 为DFA所接受的语言,记为L(DFA)
3.3.2 非确定有穷自动机(NFA)
定义3.10 一个非确定有限自动机(NFA)M 是一个五元组M=(K,VT,f,S,Z) 其中:
K:有穷状态集;
VT:有穷的输入字母表;
f:K×VT∪{ε}→ρ(K)(K的子集)是状态转换 函数;
S:为初态集,是K的非空子集;
Z:是终态集,是K的非空子集。
“非确定”即f是多值函数,且输入可允许为ε。
NFA与DFA的主要区别是:
(1) S是初态集,初态不唯一;
(2) f是多值函数,一个结点的多条引出 弧可标同一符号,而且允许输入ε 。
类似DFA,NFA可用状态转换矩阵和状态图表示。NFA所接受的符号串以及所接受语言也是参考DFA给出的定义。
(可以)
3.3.3 NFA—>DFA(确定化)
定义3.12 ε-CLOSURE(I)
设I是K的状态子集,I的ε闭包 (ε-CLOSURE(I))为:
(1)若状态P∈I,则P∈ε-CLOSURE(I);
(2)若状态P∈I,则P’∈ε-CLOSURE(I), 其中P’为由P出发,经任意条ε弧可达的K 中的状态。
例:设有NFA的状态转换图如下:
定义3.13 move(I,a)
设I是K的状态子集,状态集 合I的a弧转换(move(I,a) ),表示I中状 态经过一条a边可到达的状态的集合。而 Ia=ε-CLOSURE (move(I,a) )。
NFA—>DFA:
初态S : I =ε-CLOSURE({S})={S,3,1}
Ia={3,1,5} 记为 315
Ib={3,1,6} 记为 316
将新状态添入I,开一新行,求其Ia和Ib。如此反复,直至不再产生新的状态为止。含Z的状态均是终态。 Ia即从I中任一状态出发,经a弧(可跳过a弧之后的任意条ε弧)可达到的状态集。
根据上边状态转换矩阵,可以得到DFA N’的状态集合(表的最左列状态),即
K’={[S31],[315],[316],[31524Z],[31624Z] ,[3164Z],[3154Z]},
开始状态:[S31],
终止状态:[31524Z], [31624Z],[3164Z],[3154Z]
练习:NFA确定化
3.3.4 确定有穷自动机的化简(最小化)
最小DFA的含义:
(1) 没有多余状态 :从该自动机的开始状 态出发,任何输入串也不能到达那个状态, 或者从这个状态出发没有通路可以到达终态。
(2) 没有两个状态是互相等价(可区别)
在DFA中,状态2是不能到达的状态,而状态4是不能终止的状态,因此都是多余状态。
2.两个状态s和t等价的条件:
一致性——s和t同是终态或同是非终态
蔓延性——从s出发读入某个和 从t出发读入某个a到达的状态等价。
对 于必须 等价。
3.化简方法(分割法):
(1) 将S划分为终态集和非终态集,得S’={Z,S-Z}
(2) 递归地分割S’中的子集,使得任何两个不同子集的状态都是可区分的,而同一个子集中的状态都是等价的。
(3) S’中的每个子集合并为一个状态。 (4) 含原初态的状态为初态;含原终态的状态为终态。
例题:DFA化简
例:设有DFA M如右图所示: 划分状态集为{4}和 {0,1,2,3}
对于{0,1,2,3}和输入字符a和b:
f(0,a)=1 f(0,b)=2
f(1,a)=1 f(1,b)=3
f(2,a)=1 f(2,b)=2
f(3,a)=1 f(3,b)=4
只有状态3在输入为b时映像的后继状态不在{0,1,2,3}中,因此该状态集划分为{3}和{0,1,2}
对于{0,1,2}:状态1在输入为b时的后继状态不在{0,1,2}中,因此划分为{1}和{0,2} 对于{0,2}:
对于相同输入字符,该子集中每一状态映像得到的后继状态都相同,
因此不再可划分 最后划分为:{4} {3} {1} {0,2}
对于划分结果{4}, {3}, {1}, {0,2},把{0,2} 合并为一个状态,分别标记为新状态4,3,1, 0,其状态转换图如图:
练习:构造相应的最小的DFA
待
3.4 正规式和有穷自动机的等价性
定理4.7 (RE—>NFA)对于任意的正规式e, 存在一个与之相应的NFA M,使得L(M)=L(e)。
定理4.8 对于任意的NFA M ,存在一个与之 相应的正规式e,使得L(e)=L(M)。
待整理:
【学习笔记】
【实验内容】
【学习资料】
- 教材:《编译原理(第三版)》
- 课程资料:待上传