编译原理 词法分析

一、正规文法和正规式

1、文法与自动机的关系

在这里插入图片描述

  • 0型文法(短语结构文法):其能力相当于图灵机,可以表征任何递归可枚举集,而且任何0型语言都是递归可枚举的。

  • 1型文法(上下文有关文法CSG):产生式的形式为 α 1 A α 2 → α 1 β α 2 α_1Aα_2→α_1βα_2 α1Aα2α1βα2,即只有 A A A 出现在 α 1 α_1 α1 α 2 α_2 α2 的上下文中时,才允许 β β β 取代 A A A 。其识别系统是线性有界自动机。

  • 2型文法(上下文无关文法CFG):产生式的形式为 A → β A→β Aβ β β β取代 A A A时与 A A A的上下文无关。其识别系统是不确定的下推自动机。

  • 3型文法(正规文法RG):产生的语言是有穷自动机(FA)所接受的集合。

2、正规文法与正规式

单词符号结构的描述方法:

  • 正规文法(3型文法)
  • 正规式(正则表达式)

正规表达式(正则表达式)(regular expression)
是说明单词模式(pattern)的一种重要的表示法(记号), 是定义正规集的数学工具。

在编译中,用以描述单词符号。

定义(正规式和它所表示的正规集)
设字母表为 ∑ ∑ ,辅助字母表 ∑ ′ = { Φ , ε , ∣ , • , ∗ , ( , ) } ∑'=\{ Φ,ε,|,•,*,(,)\} ={Φε()}

  1. Φ Φ Φ ε ε ε 都是 ∑ ∑ 上的正规式,它们所表示的正规集分别为 ε {ε} ε { } \{\} {}
  2. 任何 a ∈ ∑ a∈∑ a a a a ∑ ∑ 上的一个正规式,它所表示的正规集为 a {a} a
  3. 假定 e 1 e_1 e1 e 2 e_2 e2 都是 ∑ ∑ 上的正规式,它们所表示的正规集分别为 L ( e 1 ) L(e_1) L(e1) L ( e 2 ) L(e_2) L(e2) ,那么, ( e 1 ) (e_1) (e1) , e 1 ∣ e 2 e_1| e_2 e1e2, e 1 • e 2 e_1•e_2 e1e2, e ∗ e^* e 也都是正规式,它们所表示的正规集分别为 L ( e 1 ) L(e_1) L(e1), L ( e 1 ) ∪ L ( e 2 ) L(e_1)∪L(e_2) L(e1)L(e2), L ( e 1 ) L ( e 2 ) L(e_1)L(e_2) L(e1)L(e2) ( L ( e 1 ) ) ∗ (L(e_1))^* (L(e1))
  4. 仅由有限次使用上述三步骤而定义的表达式才是 ∑ ∑ 上的正规式,仅由这些正规式所表示的集合才是 ∑ ∑ 上的正规集。

正规式中的符号

  • ∣ | ” 读为“或”(也有使用“ + + + ”代替“ ∣ | ” 的);
  • • • ” 读为 “连接 ”;
  • ∗ * ”读为“闭包”(即任意有限次的自重复连接。

在不致混淆时,括号可省去,但规定算符的优先顺序为“ ∗ * ”、“ • • ”、“ ∣ | ” 。连接符“ • • ”一般可省略不写。“ ∗ * ”、“ • • ”和“ ∣ | ”都是左结合的。

3、正规式等价

若两个正规式 e 1 e_1 e1 e 2 e_2 e2 所表示的正规集相同,则说 e 1 e_1 e1 e 2 e_2 e2 等价,写作 e 1 = e 2 e_1 = e_2 e1=e2

例如: e 1 = ( a ∣ b ) , e 2 = b ∣ a e_1= (a|b), e_2 = b|a e1=(ab)e2=ba

又如:

e 1 = b ( a b ) ∗ , e 2 = ( b a ) ∗ b e_1= b(ab)^* , e_2 = (ba)^*b e1=b(ab),e2=(ba)b
e 1 = ( a ∣ b ) ∗ , e 2 = ( a ∗ ∣ b ∗ ) ∗ e_1= (a|b)^* , e2 = (a^*|b^*)^* e1=(ab),e2=(ab)

正规式等价变换规则:

设r,s,t为正规式,正规式服从的代数规律有:

  1. “或”服从交换律: r ∣ s = s ∣ r r|s=s|r rs=sr
  2. “或”的可结合律: r ∣ ( s ∣ t ) = ( r ∣ s ) ∣ t r|(s|t)=(r|s)|t r(st)=(rs)t
  3. “连接”的可结合律: ( r s ) t = r ( s t ) (rs)t=r(st) (rs)t=r(st)
  4. 分配律: r ( s ∣ t ) = r s ∣ r t r(s|t)=rs|rt r(st)=rsrt ( s ∣ t ) r = s r ∣ t r (s|t)r=sr|tr (st)r=srtr
  5. 零一律(ε是“连接”的恒等元素): ε r = r εr=r εr=r r ε = r rε=r rε=r
  6. “或”的抽取律: r ∣ r = r r|r=r rr=r r ∗ = ε ∣ r ∣ r r ∣ … r^*=ε|r|rr|… r=εrrr

4、正规式到正规文法

5、正规文法到正规式

G = ( V N , V T , P , S ) G=(V_N,V_T,P,S) G=(VN,VT,P,S) ,存在一个 ∑ = V T ∑ =V_T =VT 上的正规式 r : L ( r ) = L ( G ) r : L(r)=L(G) r:L(r)=L(G)

  • A → x B , B → y ≈ A = x y A→xB, B→y ≈ A=xy AxB,ByA=xy
  • A → x A ∣ y ≈ A = x ∗ y A→xA|y ≈ A=x^*y AxAyA=xy
  • A → x ∣ y ≈ A = x ∣ y A→x|y ≈ A=x|y AxyA=xy

二、自动机

有穷自动机:

有穷自动机(有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具

有穷自动机分为两类:

  • 确定的有穷自动机(Deterministic Finite Automata) :DFA

  • 不确定的有穷自动机(Nondeterministic Finite Automata) :NFA

1、DFA : 确定的有穷自动机

DFA定义

一个确定的有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z),其中:

  1. K 是一个有穷集,它的每个元素称为一个状态;

  2. Σ 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号表;

  3. f 是转换函数,是在 K×Σ→K 上的映射,即,如 f(ki,a)=kj ,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态 kj ,我们把 kj 称作 ki 的一个后继状态;

  4. S∈K是唯一的一个初态;

  5. Z⊆K是一个终态集,终态也称可接受状态或结束状态。

*上的符号串 t 在DFA M上运行:

  • 一个输入符号串t,(将它表示成 Tt1 的形式,其中T∈∑,t1∈ ∑ * )在DFA M=(K,Σ,f,S,Z)上运行的定义为:

    f(Q, Tt1)=f(f(Q,T),t1),其中Q∈K 扩充转换函数 f 为 K×Σ * → K上的映射,且: f(ki,ε)= ki

* 上的符号串 t 被 DFA M接受:

  • M=(K,Σ,f,S,Z)

    若t∈ ∑ * ,f(S,t)=P,其中S为M的开始状态,P ∈ Z,Z为终态集,则称t为DFA M所接受(识别)。

DFA M所能接受的符号串的全体记为L(M)

对于任何两个有穷自动机M和M′,如果L(M)=L(M′),则称M与M′是等价

结论:
∑ 上一个符号串集 V⊂∑ * 是正规的,当且仅当存在一个 ∑ 上的确定有穷自动机M,使得 V=L(M)

DFA的确定性表现在转换函数f:K×Σ→K是一个单值函数,也就是说,对任何状态k∈K,和输入符号a∈Σ,f(k,a)唯一地确定了下一个状态

从状态转换图来看,若字母表Σ含有n个输入字符,那么任何一个状态结点最多有n条弧射出,而且每条弧以一个不同的输入字符标记

2、NFA : 不确定的有穷自动机

定义:
NFA M=(K,∑,f,S,Z),其中:

  1. K为状态的有穷非空集

  2. ∑为有穷输入字母表

  3. f为 K×∑* 到 K 的子集(2K)的一种映射

  4. S⊆K 是初始状态集

  5. Z⊆K 为终止状态集

f为 K×∑* 到 K 的子集(2K)的一种映射

对任何一个具有 ε 转移的不确定的有穷自动机NFA N,一定存在一个不具有 ε转移的不确定的有穷自动机NFA M,使得L(M)=L(N)

*上的符号串 t 在NFA M上运行:

  • 一个输入符号串t,(我们将它表示成Tt1的形式,其中T∈∑,t1∈ ∑*)在NFA M上运行的定义为:
    f(Q,Tt1)=f(f(Q,T),t1) 其中Q∈K

*上的符号串t被NFA M接受:

  • 若t ∈ ∑*,f(S0,t)=P,其中S0 ∈S,P ∈ Z,则称

    t为NFA M所接受(识别)

  • 也可以这样理解:

    对于 Σ * 中的任何一个串 t,若存在一条从某一初态结到某一终态结的道路,且这条道路上所有弧的标记字依序连接成的串(不理采那些标记为 ε的弧)等于 t ,则称 t 可为NFA M所识别(读出或接受)。

    若M的某些结既是初态结又是终态结,或者存在一条从某个初态结到某个终态结的道路,其上所有弧的标记均为 ε,那么空字可为 M 所接受。

NFA M所能接受的符号串的全体记为L(M)

结论:
∑ 上一个符号串集V ⊂ ∑ * 是正规的,当且仅当存在一个 ∑ 上的不确定的有穷自动机M,使得 V=L(M)

  • DFA是NFA的特例。对每个NFA N一定

    存在一个DFA M, 使得 L(M)=L(N);

  • 对每个NFA N存在着与之等价的DFA M

  • 有一种算法,可以将NFA转换成接受同样语言的DFA.这种算法称为子集法

  • 与某一NFA等价的DFA不唯一

从NFA的矩阵表示中可以看出,表项通常是一状态的集合,

而在DFA的矩阵表示中,表项是一个状态,

NFA到相应的DFA的构造的基本思路是:

  • DFA的每一个状态对应NFA的一组状态

DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态

3、NFA确定化算法

NFA N = (K, ∑, f, K0, Kt) , 按如下方法构造一个DFA M=(S, ∑, d, S0, St), 使得L(M)=L(N):

  1. M 的状态集 S 由K的一些子集组成。用 [S1 S2… Sj] 表示 S 的元素,其中S1 ,S2… Sj 是K的状态。并且约定,状态S1 ,S2… Sj 是按某种规则排列的,即对于子集 {S1, S2}={ S2, S1} 来说,S的状态就是[S1S2]

  2. M和N的输入字母表是相同的,即为 ∑

  3. 转换函数是这样定义的:

    d ( [ S 1 S 2 . . . S j ] , a ) = [ R 1 R 2 . . . R t ] d([S_1S_2...S_j], a) = [R_1R_2...R_t] d([S1S2...Sj],a)=[R1R2...Rt],其中
    R 1 , R 2 , . . . , R t = ε − c l o s u r e ( m o v e ( { S 1 , S 2 , … , S j } , a ) ) {R_1, R_2, ... , R_t}= ε-closure(move(\{S_1,S_2,…,S_j\},a)) R1,R2,...,Rt=εclosure(move({S1,S2,,Sj},a))

  4. S 0 = ε − c l o s u r e ( K 0 ) S_0=ε-closure(K_0) S0=εclosure(K0)为 M 的开始状态;

  5. St={[Si Sk … Se] ,其中[Si Sk … Se]∈S 且 {Si, Sk, … , Se}∩ Kt ≠ Φ}

4、构造NFA N状态K的子集的算法

假定所构造的子集族为C,即C= (T1, T2,… TI),其中T1, T2,… TI为状态K的子集。

  1. 开始,令e-closure(K0)为C中唯一成员,并且它是未被标记的。
while (C中存在尚未被标记的子集T)do {      								
   标记T;
      	for 每个输入字母a   do	{
      		U:= ε-closure(move(T,a))if  U不在C中  then
      	     将U作为未标记的子集加在C中	
      	}							   
   }

5、确定有穷自动机(DFA)化简

  • 一个有穷自动机是化简了的 < = > <=> <=>
    它没有多余状态并且它的状态中没有两个是互相等价的
  • 一个有穷自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机
  • 有穷自动机的多余状态:
    • 从自动机的开始状态出发,任何输入串也不能到达的那个状态(S2)
    • 从这个状态没有通路到达终态(S1)

DFA最小化就是寻求最小状态DFA

最小状态DFA的含义:

  • 没有多余状态(死状态)
  • 没有两个状态是互相等价(不可区别)

两个状态s和t可区别:不满足

  • 兼容性——同是终态或同是非终态
  • 传播性——从s出发读入某个 a(a∈∑) 和从 t 出发读入某个 a 到达的状态等价

最小状态DFA
对于一个DFA M =(K,∑, f, k0, kt),存在一个最小状态DFA M’ =(K’,∑, f’, k0’, kt’),使L(M’)=L(M)

结论: 接受L的最小状态有穷自动机(不计同构)是唯一的

6、DFA的最小化算法

DFA最小化算法的核心思想(分割法):

  • 把一个DFA的状态分成一些不相交的子集,使得任何不同的两子集的状态都是可区别的,而同一子集中的任何两个状态都是等价的
  • 算法假定每个状态射出的弧都是完全的,否则,引入一个新状态,叫死状态,该状态是非终止状态, 将不完全的输入弧都射向该状态,对所有输入,该状态射出的弧还回到自己

DFA M =(K,∑,f,k0,kt),最小状态DFA M’:

  1. 构造状态的一初始划分∏:
    终态 kt 和非终态 K- kt 两组(group)
  2. 对 ∏ 施用过程PP构造新划分 ∏new
  3. 如 ∏new = ∏ , 则令 ∏final = ∏ 并继续步骤4
    否则 ∏:=∏new,重复2
  4. 为 ∏final 中的每一组选一代表,这些代表构成 M’ 的状态
    若 k 是一代表且 f(k,a)=t ,令 r 是 t 组的代表, 则 M’ 中有一转换 f’(k,a)=r
    M’ 的开始状态是含有S0那组的代表;
    M’ 的终态是含有F那组的代表
  5. 去掉M’中的死状态

三、词法分析

1、正规表达式与有限自动机的等价性

定理 :设 r 是 ∑ 上一个正规表达式,则存在一个 FA M 接受 L(r),反之亦然

(1)有限自动机=>正规表达式

  • 将转换图的概念拓广,每条弧上可以用一个正规式标记。
    • 首先,在 m 的转换图上加进 x, y 两个结点。
      从 x 用 ε 弧连接到 m 的所有初态结点,
      从m的所有接受态结点用 ε 弧连接到y,
      从而构成一个新的NFA m’,L(m)=L(m’)
    • 然后,逐步消去NFA m’中的状态结点,直至剩下x,y为止。
      在消结的过程中,逐步用正规式标记弧。
      消结的过程是直观的,只需反复使用下面的替换规则:

(2)正规表达式=>有限自动机

2、正规文法与有限自动机的等价性

定理: 对于每一个右线性正规文法或左线性正规文法G,都存在一个FA m,使L(m)=L(G)

定理 对于每一个FA m, 都存在一个右线性正规文法G和一个左线性正规文法G’, 使L(G)=L(G’)=L(m)

3、词法分析

词法分析是编译过程中的一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值