630 likes | 822 Views
3. 1 词法分析程序的设计 :词法分析器的功能,输出,把它组织成单独程序 3 . 2 词法分析器的手工构造 :用 DFA 能识别单词,构造 DFA 并用程序实现它 3 . 3 有限自动机 :有限自动机的等价性, 一个 FA m , min( DFA m’) L(m)=L(m’) 3 . 4 正规表达式 :单词能用正规表达式描述,能用 DFA 识别 3 . 5 正规文法与有限自动机的等价性 3 . 6 词法分析程序自动构造工具 LEX 简介. 字母. 1. 数字. 字母. 字母. 3. 1. 1. 字母. 字母. 1.
E N D
3. 1 词法分析程序的设计:词法分析器的功能,输出,把它组织成单独程序 • 3 . 2 词法分析器的手工构造:用DFA 能识别单词,构造DFA并用程序实现它 • 3 . 3 有限自动机:有限自动机的等价性, 一个FA m , min( DFA m’) L(m)=L(m’) • 3 . 4 正规表达式:单词能用正规表达式描述,能用DFA识别 • 3 . 5 正规文法与有限自动机的等价性 • 3 . 6词法分析程序自动构造工具LEX简介
字母 1 数字 字母 字母 3 1 1 字母 字母 1 1 3 数字 3 2 2 数字 3 4 4 5 = 数字 字母 5 = ; 6 1 L L i i n n e e = = = = 8 8 0 0 ; ; ; ; 输入 字母 输出 字母 2 0 0 0 0 0 0 0 0 1 id , ‘Line’ 数字 = , 数字 4 3 num, ‘80’ ;, 数字 5 = ; 6 分析结束 有限控制器
3.1 词法分析程序的设计 • 3.1.1 词法分析程序的功能 • 源程序 单词序列 • 3.1.2 单词的词类和属性 (词类符号,单词的属性值) • 3.1.3 词法分析程序作为一个独立子程序(1)语法分析程序的子程序; (2)组织成一遍扫描。 词法分析器
While i<>j do • if i>j then i:=i-j else j:=j-I • ‘while’,‘i’,‘<>’,‘j’, ‘do’, • ‘if’,‘i’,‘>’,‘j’,‘then’, 'i', ':=’ , 'i', ’-’ , 'j', • 'else', 'j', ':=', 'j', '-', ‘i' 词法分析器
词类和属性 computator n. Calcculating machine. 程序语言单词的分类: 1.关键字(保留字或基本字):begin,end 2.标识符:用来表示各种名字 3.字面常数:256,3 .14,true,‘abc’ 4. 运算符:如,+、-、*、/ 等等 5.分界符:如逗号,分号,冒号等
词法分析器的输出: (词类编码,单词自身的属性值) 词类编码提供给语法分析程序使用;单词自身的属性值提供给语义分析程序使用。具体的分类设计以方便语法分析程序使用为原则。关键字可分成一类,也可以一个关键字分成一类。常数可统归一类,也可按类型(整型、实型、布尔型等),每个类型的常数划分成一类。单词自身的属性值提供的内容,是由词法分析和语义分析的任务划分决定的。
例如:图3.1的源程序经词法分析器〈while,—— 〉 〈id,指向j的符号表人口的指针〉 〈relational-op , NE 〉 〈id,指向j的符号表人口的指针〉 〈do,—— 〉 〈if,——〉 〈id,指向i的符号表入口的指针〉 〈id,指向j的符号表入口的指针〉
3.1.3 把词法分析设计成一个独立程序 (1)组织成一遍扫描;(2)作为语法分析和语义分析的子程序 错 误 的 诊 查 处 理 语法分析 中间代码 源程序 语义分析和 中间代码生成 词法 分析 符 号 表 管 理
32 词法分析器的手工构造 • 为了构造词法分析器,要研究构词法,每种词类的结构模式以及识别它的数学模型——有限自动机。它的模拟程序可以作为词法分析器的控制程序。 • 32 1确定的有限自动机(DFA) • 32 2构造识别单词的DFA • 32 3 编写词法分析程序
3.2.1 确定的有限自动机 DFA (Deterministic Finite Automata) 一. 设计一个奇偶校验器 二 .DFA的定义 三. DFA的三种表示 四. DFA接受的语言 五. DFA判定w是否属于L(m)的模拟算法 结论:如果我们能构造一个DFA M,使得L(M)是编译器处理的程序语言中的单词,那么模拟DFA M的程序将可以用作词法分析器的控制程序。
一设计一个奇偶校验器 DFA是由集合,序列和函数定义的数学模型,它对于上的w,判定是可接受的还是不可接受的。例如,设计一个DFA m ,奇偶校验器,首先,w是由0,1组成的字符串,因此,1. ={0 ,1}且w在一条输入带上。 0 1 0 1 1$ 读头
2. 状态集:它记忆已读入w子串的状态,m是奇偶校验器,它应该记住,初始序列是奇数个1还是偶数个1。因此,m有even和odd两个状态. 3 .even为开始状态。 4 . 转换函数,(qold , ,a)=qnew m有: (even ,,0)=even (even ,1)=odd (odd ,0)=odd (odd ,1)=even 5. 接受状态(或终止状态)集{odd} 若w使m从初始状态出发,最后到达一个接受状态,则w被m接受;否则w被m拒绝。
二 定义3.1 一个确定的有限自动机 M(记 作DFA M)是一个五无组 M=(Σ,Q,q0,F,δ),其中 (a)Q是一个有限状态集合。 (b)Σ是一个字母表,它的每个元素称 为一个输入符号。 (c)q0∈Q,q0 称为初始状态。 (d)F∈Q,F称为终结状态集合。 (e)δ是一个从Q× Σ到Q的单值映射 δ(q,a)=q’(q,q’∈Q,a∈Σ) 表示当前状态为q,输入符号为a时,自动机将转换到下一个状态q’,q’称为q的一个后继。
例3.3 设DFA M=({a,b},{0,1,2, 3},0,{3},δ)其中 δ(0,a)=1,δ(1,a)=3 δ(2,a)=1,δ(3,a)=3 δ(0,b)=2,δ(1,b)=2 δ(2,b)=3,δ(3,b)=3 三 一个DFA有三种表示: (1)象上面,用转换函数; (2)转移矩阵; (3)状态转换图。
转移矩阵 状态转换图 a 1 a a 0 a 3 3 b 2 b b b 易存储
四 DFA M 接受的语言 如果对所有w∈Σ*,以下述方式递归地扩张δ的定义 δ(q,ε)=q, δ(q,wa)=δ(δ(q,w),a), 对任何a∈ Σ,q∈Q,则有 L(M)={w|w∈Σ*,若存在q∈F, 使δ(q0,w)=q} 对于例3.3的DFA M和w=baa, δ(0,baa)=δ(2,aa)= δ(1,a)=3
从状态转换图看,从初态出发,沿任一条 路径到达接受状态,这条路径上的弧上的标 记符号连接起来构成的符号串被接受。 b 0 3 b a a a a b 1 2 b
五.DFA M 判定 w∈?L(M)的算法: • 输入:w$ • q:=q0; a:=nextchar; • WHILE a<>"$" DO • BEGIN • q:=move(q,a); • a:=nextchar; • END; • IF q IN F THEN return (”yes") • ELSE return (”no");
3.2.2 手工构造识别单词的DFA m 根椐DFA识别单词的定义,在研究给定程序语言单词结构的基础上,能直接构造出识别它的DFA m。例如:对于Pascal, 标识符:字母开始的字母数字串。 整数:非空数字串。 无符号实数(用表示数字): (a) dd.d dE(+- ) dd (b) ddE(+- ) dd (c) dd.d d
字母 * 0 字母 1 2 Pascal 标识符 数字 * 数字 0 3 4 Pascal整数和实数 数字 E – d d d * E + d d d 0 1 7 2 3 4 5 6 7 d
3.2.3 编写词法分析程序 根据画出的状态转换图(识别单词的)构造词法分析程序,每个状态对应一段程序,完成到达此状态的工作;词法分析程序的控制程序模拟状态转换图的状态转换。 在识别标识符的过程中,要拼写出来,并和保留字区别开来;在识别常数的过程中,要把它转换成机器表示以作为属性值。
使用下面的全局变量和过程: 1. Character 2. Token 3. Getchar 4. getbc 5. Concatenation 6. letter,digit 7. Reserve 8. Retract 9. buildlist 10. return
作业: 3.2 3.3解释下面每个有限自动机识别的语言是什磨? 1 1 0 0 (a) 1 2 3 4 5 1 0 1 0 0 0 0 6 7 8 9 1 1 1 (b) a a a a 1 2 3 4 5 a
1 0 ( c ) 1 0 0 0 1 2 1 0 3.4 给出接受下列在字母表{0,1}上的语言的DFA: ( a ) 所有以00结束的串的集合; (b) 所有具有三个0的串的集合。
3. 3 有限自动机FA m 3. 3. 1 非确定的 有限自动机NFA m 一. NFA m 二. FA 的等价定理 三. 例3.3,用DFA模拟NFA的动作 四. 从一个NFA构造DFA的算法 3. 3. 2 确定的 有限自动机的化简 一.何谓确定的 有限自动机的化简 二.等价状态的定义 三.确定的 有限自动机的化简方法
一. 非确定的有限自动机NFA m 定义3.2 非确定有限自动机M是一个五元组 M=(Σ,Q,q0,F,δ) 其中Σ,Q,q0,F的意义和DFA的定义一样,而δ是一个从QXΣ∪{ε}到Q的子集的映射,即δ:QXS2Q 类似DFA,NFA m可用状态转换图表示,可定义NFA m接受的语言。
二. FA的等价性 定理3 . 1 对任何一个NFA m,都存在一个 DFA m’,使L(m’)=L(m) 证明思想:用m’的一个状态对应m的一个状 态集合,用这种方法,能从一个NFA m 构造一个DFA m’,称作子集构造法。 例3 . 2 NFAm=(0,1 , q0,q1,q0, ),其中 (q0,,0)= q0,q1, (q0,,1)= q1 (q1,,0)= (q1,,0)= q0,q1
L(m)=L(m’)={0,1}+—10{0,1}* 0 1 1 0 q0 q0 q1 1 1 q0 {q0} {q1} 0 1 q0 {q0,q1} 0,1
a a 2 2 2 2 2 3 3 a a b b b b 0 0 6 6 6 6 1 1 1 1 1 7 7 7 7 7 8 8 9 9 10 10 b b b 5 5 5 0,1,2,4,7 4 4 4 4 4 a 3,8,6,1,2,4,7 b 例3.3从具体例子的讨论,提炼出从NFA构造DFA的算法。 5,9,6,1,2,4,7 b 5,10,6,1,2,4,7
四. 从NFA构造DFA的算法 1.—closure(S)的定义和算法 从S中任一状态出发,仅沿弧到达的状态集合,T=S ( edge(t, )), 其中, edge(t, a)是NFA中从状态t出发,仅沿a弧到达的状态集合。如下计算T: T:=S; REPEAT T’:=T ; T:=T’ ( edge(t, )) (tT’) UNTIL T=T’ tT
2. DFA的转移函数 DFAedge(d, a)= —closure( edge(t, a)) 其中, d是NFA的状态集, a。 从NFA构造DFA,是对于NFA的所有输入,,用DFA模拟NFA的动作,令t1是NFA的初态,DFA的初态d1= —closure(t1) ,若, dj= DFAedge(di, a),那磨,从di到dj存在一条用a标识的弧。 算法3,2 从一个NFA构造一个DFA td
States[1] :=ε-closure({t1}); • p:=1; j:=1; • WHILE j<=p DO • for each a∈Σ • e:=DFAedge(states[j],a); • IF e=states[i] for some i<=p • THEN trans[j,a]=i • ELSE p: =p+1; • states[p]:=e; • trans[j,a]:=p; ; • ; j:=j+1; •
a 3 2 b b a 0 6 1 7 8 9 10 b 5 4 0,1,2,4,7 2 3 3,8,6,1,2,4,7 2 4 5,6,1,2,4,7 2 3 5 5,9,6,1,2,4,7 2 5,10,6,1,2,4,7 2 3
3.3.2 确定的有限自动机的化简 一. 何谓确定的有限自动机的化简 所谓一个DFA m=(, Q, q0, F, )的化简是指寻找一个状态数比较少的DFA m’,使 L(m)=L(m’)。而且可以证明, 存在一个最 少状态的DFA m’, 使L(m)=L(m’)。 二.等价状态的定义 设p,q Q ,若对任何w *, (p,w) F 当且仅当 (q,w) F ,则称p和q是等价状态。否则,称p和q是可区别的。
q2 a a a ,b b q1 q4 a q3 b b a a b q2 q4 q5 a b q1 b a a b a b q3 a q6 q7 b b
1.等价状态定义了状态集合上的等价关系。因此,状态集合能被划分成等价类;1.等价状态定义了状态集合上的等价关系。因此,状态集合能被划分成等价类; 2 .两个状态p和q等价应满足如下条件: (a)一致性条件, p和q必须同时或为接受 状态或为非接受状态; (b)蔓延性条件,对于a , (p,a)=r, (q,a)=s, r和s必须等价; 相反, r和s不等价, p和q不等价。 判定两个状态p和q不等价,只要o找到一个w*, 使(p,w)F 且(q,w) F,或者相反。 W称为判别序列。
三. 方法: 构造一张表,对每一个状态对(qi,qj)(i<j)有一表项,每当发现一对状态不等价时,就放一个x到相应表项中。 1 . 根据一致性条件,在每一个对应于终结状态和非终结状态的表项中放上一个x。 2 .根据蔓延性性条件,对每一个状态对(p,q),若a,(p,a)=r, (q,a)=s,r和s不等价,则(p,q)不等价。重复2,直到没有新的不等价状态对出现。
0 1 1 0 q1 q2 q3 0 1 1 0 0 1 1 0 q5 q6 q7 q8 q2 q3 q5 q6 q7 q8 1 x 0 x x x x x x x x x x x x q1 q2 q3 q5 q6 q7
3.4 正规表达式 用正规表达式描述单词,把它转换成识别装置----有限自动机。 3.4 .1正规表达式与单词 一.正规表达式的定义 二.正规表达式的代数性质 三.正规定义式 四.例示,用正规定义式描述单词 3.4 .2 正规表达式与有限自动机的等价性 L( r )=L(m)
一. 正规表达式的定义 是字母表 正规表达式 正规表达式表达的语言 1. , {}, 2. a , a {a} 3. 若r, s L( r ) , L(s) 则 ( a ) (r)(s) L( r ) L(s) ( b ) (r)(s) L( r ) L(s) ( c ) ( r )* ( L( r ))* ( d ) ( r ) L( r )
注:(1)正规表达式描述的集合称作正规集(正规表达式的计算描述如何构造正规集)。(2)“*”,连接,“”运算左结合,优先级由高到低。注:(1)正规表达式描述的集合称作正规集(正规表达式的计算描述如何构造正规集)。(2)“*”,连接,“”运算左结合,优先级由高到低。 例:=A,B,…,Z,a,b,…,z,0,1,…,9 A B... Z a b... z L( A)L( B)…L( Z) L( a) L( b)... L(z) = A,B,…,Z,a,b,…,z 0 1 .. . 9 L(0) L(1) ... L(9)= 0,1,…,9
( A B... Z a b... z) (( A B... Z a b... z) (0 1 .. . 9))* A,B,…,Z,a,b,…,z (A,B,…,Z,a,b,…,z 0,1,…,9)* 标识符 例3.3 =a,b (a) a b a,b (b) (a b )(a b ) aa,ab,ba,bb ( c) a* ,a,aa,aaa,aaaa,… (d) (a b)* (,a,b,aa,ab,ba,bb,aaa,... (e) a ab*
正闭包r+, 表达的语言 (L( r ))+ (L( r ))+=(L( r ))1 (L( r ))2 (L( r ))3…… r*=r+ r+= r r* 三.正规定义式 给正规表达式命名,引用。 ,序列: d1r1 d2 r2 ... dnr n 其中di表示不同的名子,每一个ri是 d1,d2,…,di-1上的正规表达式。 正规定义式和产生式的区别。
四.例示,用正规定义式描述单词 例3.4 Pascal标识符和无符号实数 letter(letterdigit)* letterA B ... Z a b ... z digit 0 1 ... 9 id letter(letterdigit)* (digit)+(.(digit)+ )((E(+ - )(digit)+) ) digits digit(digit)* fraction digits exponent ( E(+ - )digits) num digits fraction exponent
3.4.2 正规表达式与有限自动机的等价性 单词结构用正规表达式描述,用机械的方法(程序),把正规表达式变换成等价的有限自动机。 定理3.2 设r是上一个正规表达式,则存在一个FA m接受L( r )。反之亦然。 证 对正规表达式r的运算数目作归纳。设r具有零个运算,则或r=或r= 或r=a a q0 q0 q1 q0 q1 r= r=a r=
设结论对少于i(i1)个运算的正规表达式r成立。当r有i个运算时,有三种情况:设结论对少于i(i1)个运算的正规表达式r成立。当r有i个运算时,有三种情况: 情况1 r=r1r2 情况2 r=r1r2 情况3 r=r1* 有 m1=(1,Q1,q1,F!,1), m2=(2,Q2,q2,F2,2) 且L(m1)=L( r 1), L(m2)=L(r2) ,由m1和m2构造m,使得 L(m)=L( r ).构造方法图示如下: m1 q1 f1 q0 f0 m2 q2 f2 r=r1r2
m2 m1 q1 f1 q2 f2 r=r1r2 q0 q1 f1 f0 r=r1* 上述证明方法,是对于一个正规表达式r,构造一个FA m,且L(m)=L( r )的算法,但假定知道r的计算顺序。 正规表达式r的语法是上下文无关文法。
例3.5构造与下列正规式 ( c) r=01*1 等价的有限自动机。语法树如左下图。 0 q0 q1 1 1 q2 q3 * 0 1 q4 q2 q3 q5 1
1 0 q0 q3 q1 q4 q2 q5 1 q6 q7 0 1 q0 q1 q4 q2 q3 q5 q8 q9 1 q6 q7