编译原理第三章词法分析和词法分析程序设计扫描器时应考虑的问题▪词法分析程序亦称为扫描器▪任务:扫描程序,识别单词▪扫描器的输出是语法分析程序的输入词法分析的必要性▪描述单词的结构比其它语法结构简单,仅用3型文法就够了;▪将单词识别从语法分析识别分离出来,可采用更有效的工具实现;▪有些语言的单词识别与前后文相关,不宜将其与语法分析合并;▪使编译程序各部分独立出来,有利于设计、调试和维护单词符号的内部表示▪常用的内部表示方法: (class,value)▪为便于阅读,常用助记符(或常量标识符、宏定义等)表示class。
▪在识别出变量名、函数(过程)名时,还应进行查填符号表的工作。
识别标识符的若干约定和策略▪在允许长度下,应按最长匹配原则进行识别▪有时需要超前扫描来进行单词识别。
由正规文法构造状态转换图例:正规文法如下:3.2 正规文法和状态转换图<无符号数> → d.<余留无符号数><无符号数> → .<十进小数><无符号数> → E<指数部分><余留无符号数> → d<余留无符号数> <余留无符号数> → .<十进小数><余留无符号数> → E<指数部分><余留无符号数> → ε<十进小数> → d<余留十进小数><余留十进小数> → d<余留十进小数> <余留十进小数> → E<指数部分><余留十进小数> → ε<指数部分> → d<余留整指数><指数部分> → +<整指数><指数部分> → -<整指数><整指数> → d<余留整指数><余留整指数> → d<余留整指数><余留整指数> → ε所对应的状态转换图123456dd••dd dd dEE+ | -无符号数的状态转换图3.2 正规文法和状态转换图由正规文法构造状态转换图▪程序设计语言的单词都能用正规文法描述▪一般说来,凡能用正规文法描述的语言,均可由某种有限状态算法——状态转换图进行分析▪状态转换图:▪有向图(一个初态+N个终态)▪射出结点,进入结点由右线性文法构造状态转换图1.|V N |=K ,则所要构造的状态转换图共有K+1个状态(结点)•构造规则:A →aB ,A →a ,A →εAFBaaA2. 识别串:字符串w=a1a2…a n, a i∈V T•实际:建立推导S⇒* w3.(1) 自顶向下(2) 从S出发:a1a2…a k A k(3) 对任一句子y,必存在一条路从S至F,各标记相连即y显然,若我们从初态出发,分别沿一切可能的路径到达终态结点,并将中径中矢线上所标记的字符依次连接起来,便得到状态转换图所能识别的全部符号串,这些符号串组成的集合构成了该文法识别的语言——句子必有一条从初态S到终态F的路径,此路径上各矢线的标记依次拼接起来所组成的符号串恰为该句子▪由左线性文法构造状态转换图▪初态R(∉V N )▪构造规则A →aA →Ba▪例:文法G=({S,U},{0,1},{S →S1 |U1, U →U0 | 0},S)•识别句子00011▪归约——对应的语法树BAaRAaRU1S1B ij :a 1…a mS 1B 11…B 1m S 2B 21…B 2m…S nB n1…B nmS iB ija j若无则置“出错”太浪费!!!用有效的数据结构如表3-1构造状态矩阵,控制程序对单词加以识别控制程序大都相同,状态矩阵不同开始初始化getchar()查状态矩阵(state, symbol )end?回退一个字符返回(R, N )实数类码二进制浮点正规表达式构造识别该正规表达式的带ε的自动机将ε-自动机转化为DFA,并且最小化根据最小化的DFA构造状态矩阵编写控制程序,对词法进行识别有限自动机▪状态转换图实际上是有限自动机的图形表示▪DFA NFA确定的有限自动机DFA▪五要素M=(K, ∑, f , S0, Z )状态集合字母表状态映射初态终态集状态映射f:K⨯∑→K可将f定义域推广为K⨯∑* →K(1) f^ (s,ε)=s, s∈K;(2) f^ (s,aw)=f^ ( f(s,a),w), s∈K, a∈∑, w∈∑*; 所以,f与f^不可区分▪DFA M识别∑*中的x:从初态S0出发,经一恰好标有x 的路径后可达到某终态S∈Z即:f(S0,x)=S,S∈Z▪M的接受集L(M)={ x| f(S,x) ∈Z, x∈∑* }▪DFA:给一状态,一字符,则唯一确定下一状态▪任一正规文法G,都存在一个DFA M,使得:L(G)=L(M)对于文法:G=({S,A,B,C,D}, {a,b,c,d},P,S),P由如下产生式组成:S→aA|B A→abS|bB B→b|cC C→DD→d|bB(1)构造该文法的状态转换图(2)构造一等价的左线性文法非确定的有限自动机▪NFA M=(K, ∑, f , S 0, Z )▪f :K ⨯∑→ρ(K),即将(Si ,a j )映射到K 的一个子集{S k 1,…,S k m } 即:下一状态不唯一▪可类似地,把f 的定义域拓广到K ⨯∑*(1) f^(S,ε)={S};(2) f^(S,aw)=f^(f(S,a),w) a ∈∑,w ∈∑*mi k k k k w S f w S S S f w a S f f aw S f i m 1^^^^),()},,,,({)),,((),(21====的接受集▪L(M)={x | f(S 0, x )∩Z ≠∅, x ∈∑}▪例:S ABCaa,b ab baa识别符号串ababbNFA 与DFA 的等价性▪NFA 的确定化:构造一DFA ,使得它们有相同的接受集▪思路:使DFA 的状态与NFA 某一状态子集相同S 0S 1abba|b定理3.1例:M=({S 0,S 1}, {a,b}, f, S 0, {S 1}) 此确定化算法的弱点具有ε动作的FA▪允许对ε作转移▪例:0123εεεa bbcf 也可以拓广到f ’: K ⨯∑* →ρ(K). f ’(S,x)是由这样的状态Q 组成,存在从S 到Q 的路径,该路径上的连线标记组成的符号串恰好为x ,其中,允许有有限个标记为ε串aacc 可被接受S的ε-闭包:ε-CLOSURE(S)▪定义(1)S∈ε-CLOSURE(S);(2)设S j∈ε-CLOSURE(S),且S j →εS k,则S k∈ε-CLOSURE(S);(3)有限地使用规则(2)所得的集合为ε-CLOSURE(S).▪例0123εεεabbc的定义Rq Rq KKKw S f q w q f w R f a q f a R f K R R f R f f a q f a w S f f P P CLOSURE wa S f S CLOSURE S f w a K S ∈∈∈==⊆∈∀→∑⨯==-=-=∑∈∑∈∈∀),(),()4(),(),(:)(2,22:)2(,)3(),()),,((,);(),()2();(),()1(,,^^*^),(^^^*^对的定义拓广到及将实际上其中εεεf与f^不相等f(S,a) ⊆ε-CLOSURE(f(S,a)) ⊆f^(S,a)只走一步a矢线| 多步,第一步必须走a矢线| 路径a :第一步可以是ε矢线ε-NFA的接受集:L(M)={w|f^(S0,w)∩Z≠∅} ε-NFA的用途:构造更复杂的FA5ε-FA 的确定化▪构造一DFA ,使得它与ε-FA 等价。
▪例0123εεεa bbc试将下面的ε-FA 确定化为DFA:S125634εεεεaaa abbbbF6DFA状态数的最小化▪对一个DFA M,构造另一个DFA M’,使得:L(M) = L(M’),后者有最小的状态数▪可区分状态:s,t ∈K,若∍w∈∑*,f(s, w) = q ∈Z,而f(t, w) = p ∉Z,则s,t为一串w所区分▪s和t等价:∀w,f(s,w) ∈Z,f(t,w) ∈Z▪所以,可以将等价的状态合并▪算法主要思想:将K划分为r个互不相交的子集,子集内任何两个状态是等价的,而不同子集任两个状态可区分。
▪例:S2S4b aaabbS0S1S3ba ab正规表达式及正规集▪L(G)≡L(M),即:正规文法与FA等价▪所以,现在来为一个正规表达式构造一等价的FA正规表达式及正规集的定义▪举例▪定义设∑是一字母表,则∑上的正规表达式(正则表达式,正规式)及其表示的正规集可递归定义如下:▪(1) φ是一正则表达式, 相应的正规集为φ;▪(2) ε是一正则表达式, 相应的正规集为{ε};▪(3) ∀a∈∑, a 是一正则表达式, 相应的正规集为{a};▪(4) 设r, s是正则表达式, 且它们所表示的正规集为Lr, Ls,则• 1. (r) •(s)是正则表达式, 相应的正规集为Lr•Ls;• 2. (r)|(s)是正则表达式, 相应的正规集为Lr ∪Ls;• 3. (r)*是正则表达式, 相应的正规集为Lr*▪有限地使用上面的规则(4),所得的表达式均是正规表达式▪a*, aa*, a|ba*, (a|b) (a|b) (a|b)*▪正规集1:n 正规式▪正规式r =正规式s L r =L sA1. r|s=s|r A2. r|r=rA3. r|φ=r A4. (r|s)|t=r|(s|t)A5. (rs)t=r(st)A6. r(s|t)=rs|rtA7. (s|t)r=sr|st A8. rφ=φr=φA9. rε=εr=r A10. r*=(ε|r)*=ε|rr*由正规文法构造相应的正规式▪例:S→aS | bA | b,A→aS 则所产生的正规集为▪论断3.1 方程x= rx + t 有解x= r*t▪例S→bS|aA A→aA|bBB→aA|bC|b C→bS|aA▪左线性文法:x=xr+t的方程,有解x=tr*正规式构造FA−Thompson法▪对运算符个数n进行递归▪算法:1、n=0时:r=φr=εr=a∈∑s f f s fa2、设当n=1,2,…,k-1时,M均可构造,当n=k时,根据正规式的定义,r只能是r1|r2, r1•r2, r1*这三种形式之一.其中, r1,r2中最多含k-1个运算符,且设相应的自动机为M1=(K1, ∑,f1,S01,{S f1})L(M1)=L r1M2=(K2, ∑,f2,S02,{S f2})L(M2)=L r2K1∩K2=∅法(续)(1) r= r 1|r 2,引入新开始状态S 0,终态S f ,将M 1,M 2并联:S 01S f1S 02S f2sS f εεεε(2) r=r 1∙r 2,将M 1,M 2串联S 01S f1S 02S f2ε(3) r=r*,引入新开始状态S 0,终态S f ,令原M 1构成循环S 01S f1S S fεεεε在实际的构造中,我们可省略一些ε矢线。