编译原理词法分析

时间:2021-05-11 19:53:57

词法分析器:

编译原理词法分析

正规表达式与有限自动机

三个问题:

    正规式<->NFA

    NFA->DFA

    DFA->化简

一些概念:

我们可以把具有相同特征的字放在一起组成一个集合,即所谓的正规集,

然后使用一种形式化的方法来表示正规集,即所谓的正规式

(1)ε和φ是∑上的正规式,它们所表示的正规集分别为{ε}和φ
  (2)任何a∈∑,是∑上的一个正规式,他所表示的正规集为{ a }
  (3)假定U和V都是∑上的正规式,他们所表示的正规集分别记为L(U)和L(V),那么
(a) (U|V)是正规式,所表示的正规集为L(U)∪L(V)
(b) (UV)是正规式,所表示的正规集为L(U) · L(V)(连接积)
(c) (U)*是正规式,所表示的正规集为 (L(U))*(闭包)

仅由有限次使用(1)(2)(3)所得到的表达式才是∑上的正规式,仅由这些正规式所表示的字集才是∑上的正规集

两个正规式的等价:若两个正规式U和V所表示的正规集相同,则认为二者等价,记为:U = V

设U,V,W是上的∑正规式,则
(1) U | V = V | U 或的交换律
(2) U | ( V|W ) = ( U|V ) | W 或的结合律
(3) U ( VW ) = ( UV ) W 连接积的结合律
(4) U ( V | W ) = ( UV ) | ( UW ) 分配律
     ( V | W ) U = VU | WU

(5) εU = Uε = U

确定的有限自动机(DFA)(Deterministic Finite Automata)

    一个确定有限自动机(DFA)M是一个五元式:
    M = (S, ∑, f, s0, F),其中
    S是一个有限的状态集合,它的每个元素我们称为一个状态
    ∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符
    f是从 S×∑ →S的单值部分映射
    s0是S的一个元素,为初始状态,它是唯一的
    状态集合F是终止状态的集合,它是S的子集(可空)

非确定的有限自动机(NFA)(Non-deterministic Finite Automata)

    一个非确定有限自动机(NFA)M是一个五元式
    M = (S, ∑, f, S0, F),其中
    S是一个有限的状态集合,它的每个元素我们称为一个状态
    ∑是一个有限的输入符号的字母表,它的每个元素我们称为一个输入字符
    f是从S×∑*→2S 的部分映射,其中,2S表示S的幂集合(所有S的子集组成的集合)(f是非单值的M是非确定)
    状态集合S0是初始状态集合,它是S的子集

    状态集合F是终止状态的集合,它是S的子集

有限自动机的等价:对任何两个有限的自动机M1和M2,若有L(M1)=L(M2),则称M1与M2等价

*  若M的某些结点既是初态结点又是终态结点,或者存在一条从某初态结点到某个终态结点的ε通路,那么空字ε可为M所识别

*  DFA是NFA的一个特例,对于每个NFA M存在一个DFA M’使得L(M) = L(M’),也就是说M和M’是等价的

*****正规式与有限自动机的等价性:

定理1:对于任何∑上NFA M都可构造一个∑上的正规式V,使得  L(V) = L(M) ,其中,L(M)是∑上NFA M所能识别的字的全体

L(V)是∑上的正规集

**NFA M构造正规式

(1)在M转换图上加进X结点和Y结点,从X结点用弧ε连接M的所有初态结点,M的所有终态结点用弧ε连接到Y,得到一个NFA M’,且L(M) = L(M’)

(2)使用替换规则逐步消去M’的所有结点,直到只剩下X结点和Y结点,在消去过程中,逐步使用正规式来标记箭弧

编译原理词法分析

定理2:对于∑上的每一个正规式V,存在一个∑上的DFA M,使得L(M) = L(V)

**正规式V,构造一个DFA M

    1.根据V,构造一个NFA M’,使得L(M’) = L(V)

    2.将M’确定化,变为DFA M

课本例题7.1:

编译原理词法分析


解题思路:

第一步,在∑上构造一个NFA M’

(1)构造一个拓广的转换图

(2)使用分裂规则对V进行分裂,加进新结点,直到把图转换成每条弧上标识为∑上的一个字符或ε,最后得到一个NFA M’
且L(M’) = L(V)

编译原理词法分析

第二步,把M’确定化

定义1:假定I是M’的状态集的子集,定义I的ε闭包ε_CLOSURE(I)为:
(a)若q∈I,则q∈ε_CLOSURE(I)

(b)若q∈I,那么从q出发经任意条ε弧而能到达的任何状态q’都属于ε_CLOSURE(I) ;

定义2:假定I是M’的状态集的子集,a ∈ ∑,定义
Ia =ε_CLOSURE(J)

其中,J是所有那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体

求Ia 可以分为两步:
       根据集合I,求集合J(一条a弧)

       求J的ε闭包ε_CLOSURE(J),即是Ia

*****确定有限自动机的化简(最少化)

**DFA化简

(1) 检查状态转换函数是否为全函数。
所谓全函数,是指每个状态对每个输入符号都有转换
若不是全函数,可以引入一个“死状态”d,d对所有输入符号都转换到d,如果状态s对输入符号a没有转换,那么加上从s到d的a转换。
(2) 用化简算法进行化简

(3) 去掉死状态

化简算法

①对M的状态集S进行划分:

把S的终态和非终态分开,分成终态集合非终态集,形成基本分划П,显然这两个子集是可区别的。
②假定到某个时候П含有m个子集,
记П={I(1),I(2),… I(m)}
并且,属于不同子集的状态是可区别的。
检查П中的每个I(i)看能否进一步划分:
对于某个I(i),令I(i)={q1 ,q2 ,…,qk}

若存在一个输入字符a使得I(i)a不全包含在现行П的某个子集I(j)中,就将I(i)一分为二

课本例题12(b)

编译原理词法分析

感悟:

        说是从课件上粘贴概念毫无意义却还是粘了觉得这些东西重要一点,再说说我自己的理解,这章词法分析,目的是产生一个词法分析器,我们先粗略的说了一下词法分析器的若干概念,重点却又放在正规式,正规集,利用正规式去产生自动机,自动机和正规式之间能够互相转化根据性质,自动机分为确定的有限和不确定的有限,其中DFA又是NFA的一个特例,NFA能够转化成DFA,DFA又能进行化简得到最小的DFA,课本上的题应用类的还是不是很明白,可能做那种简单的化简转化题不是问题,但是过河或者自己设计的应用类问题还是一头雾水,没有那种学以致用的思维很难受。