编译原理第三章总结——词法分析

      词法分析器是执行词法分析的程序,词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。

      词法分析的功能是输入源程序,输出单词符号。单词符号是程序语言的基本语法符号,一般分为关键字、标识符、常数、运算符、界符。词法分析器所输出的单词符号表示为:<单词种别,单词符号的属性值>。应用见课后题第二题。

      下面是关于词法分析器的设计,首先要了解词法分析器的结构:

     

      输入源程序文本,放入输入缓冲区中,词法分析工作可在这个输入缓冲区中工作。剔除无用的空白,跳格(TAB),回车,换行等编辑性字符;若空白符号为单词符号的界符,就将若干空白和并为1个。剔除注释行,比如/*…*/。源程序的出错列表打印。将预处理好的子程序放到扫描缓冲区中。扫描缓冲区设两个半区,可互补使用。设起点指针和搜索指针两个指针。而扫描器就可以直接扫描缓冲区,进单词识别。

      接下来是对于单词符号的识别。超前搜索:在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进行。直接分析法:根据读来的第一个字符的种类分别转到各种子程序处理。这些子程序功能就是识别以相应字符开头的各种单词。最后,还有状态转换图法(有向图)。

      本章重点:正规表达式与有限自动机

      正规集与正规式:我们可以把具有相同特征的字放在一起组成一个集合,即所谓的正规集然后使用一种形式化的方法来表示正规集,即所谓的正规式。【注】正规式是描述单次结构的形式(文法),而正规集是描述文法的语言。掌握正规式的等价和五个性质。应用见课后题。

      有限自动机分为确定有限自动机和非确定有限自动机。

      

      一个确定有限自动机(DFA)M是一个五元式:

      M = (S, ∑, f, s0, F),其中

      S是一个有限的状态集合,它的每个元素我们称为一个状态。

      ∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符。

      f是从 S×∑ →S的单值部分映射。

      s0是S的一个元素,为初始状态,它是唯一的。

      状态集合F是终止状态的集合,它是S的子集(可空)。

      可以用状态转换矩阵来表示:

      也可以用状态转换图表示:


     一个非确定有限自动机(NFA)M是一个五元式

    M = (S, ∑, f, S0, F),其中

    1)      S是一个有限的状态集合,它的每个元素我们称为一个状态

    2)      ∑是一个有限的输入符号的字母表,它的每个元素我们称为一个输入字符

    3)      f是从S×∑*→2S 的部分映射,其中,2S表示S的幂集合(所有S的子集组成的集合)
    (f是非单值的àM是非确定)

    4)      状态集合S0是初始状态集合,它是S的子集

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

     同样,一个非确定有限自动机也可以用状态矩阵和状态转换图来表示。

    定理1:对于任何∑上NFA M都可构造一个∑上的正规式V,使得  L(V) = L(M)

    其中,L(M)是∑上NFA M所能识别的字的全体L(V)是∑上的正规集

    由一个NFA M,构造一个正规式V方法:

    (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

    用子集的方法确定化:构造一张表,把每个集合看成一个状态,得到状态转换表,并得到处态和终态。这样就变成了DFA M。

    最后是确定有限自动机的化简。

    基本思想:把M的状态集分割为一些不相交的子集,使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,最后让每个子集选一个代表,同时消去其他等价状态。

    算法:

①对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)一分为二

③一般地,若I(i)a落入现行П中N个不同子集,则应将I(i)划分为N个不相交的组,使得每个组J的Ja都落入П的同一子集,这样再形成新的分划

④重复上述过程,直至分划中所含的子集数不再增长为止。至此,П中的每个子集已不可再分。也就是说,每个子集中的状态是互相等价的,而不同子集中的状态则是互相可区别的。

⑤经过上述过程后,得到一个最后分划П.对于这个П中的每个子集,选取子集中的一个状态代表其它状态。

 [例如,假定I={q1 ,q2,…,qk}是这样一个子集,可挑选q1代表这个子集。在原来的自动机中,做:

                   a.凡导入到q2 ,…,qk的弧都改成导入q1

                   b.将q2 ,…,qk从原来的状态集S中删除

                   c.若I中含有原来的初态,则q1是新初态

                   d.若I中含有原来的终态,则q1是新终态]

         到此,得到一个化简得DFAM’,使得n L( M )=L( M’)

本章知识点应用:


      总结:本章知识较上一章深度大一些,不过通过上课老师讲例题和课后做题能把知识点一点点联系起来,理解更透彻一些。对于一些正规式的证明和状态转换图等,很容易联想到离散数学和数据结构的知识。通过做题,我意识到自己还是有一些不足,比如对于有限自动机的化简还是需要很长时间去思考和尝试,希望通过回顾总结,多次练习可以吃透,争取在短时间内可以做出题来。












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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值