为了判断一个输入串是否符合语法规则,有自上而下的的分析,即从文法的起始符出发进行句子的推导。也有自下而上的规约,即从句子本身出发,进行归约,看能否把句子规约为到起始符。这一章主要讲述的是自上而下的推导。但是一个文法可能会存在左递归,回溯,虚假匹配等等的问题,就会影响推导的效率,浪费大量的精力与时间,为了更加简便的实现推导,先将文法进行规范化。也就是去除这些问题。
       存在的问题
1.文法左递归

       当试图用P去匹配输入串时,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配,这样一来,使推导无限循环下去。

1)直接左递归原式:

        P→Pα1|Pα2|…|Pαm|β1|β2|…|βn

    改为

        P→β1P’|β2P’|…|βnP’

        P’→α1P’| α2P’|…|αmP’| ε

2)将间接左递归改造为直接左递归

     将文法中所有如下形式的产生式:

           Pi →Pjγ|β1|β2|…|βn

           Pj→δ1|δ2|δ3|…|δk

    改写成:

           Pi →δ1γ|δ2γ|δ3γ|…|δkγ|β1|β2|…|βn

2.回溯

     匹配不成功,需要回溯。需要把已经做过的一大堆工作(各种表格工作、语义分析等)推倒重来,既费时又费
1)无回溯文法定义太过于理解起来费力,这就举例子说明。
        对于A→α1|α2|…|αn
        如果b ∈FIRST(αi),则用αi去匹配b
        FIRST(α1)∩FIRST(α2)∩…∩FIRST(αn)=Φ
(2)改造方法:(消除回溯
        提取公共左因子
        假设A的产生式为
            A→δβ1|δβ2|…|δβn|γ1| γ2|…|γm
        其中每个γ不以δ开头
        那么把这些产生式改写为:
            A→δA’ |γ1| γ2|…|γm
            A’→β1|β2|…|βn

3.LL1文法

       如果首符集不含有字符串中的某个字符但是却含有空字,而且他的下一个字符会含有此字符此时只有首符集不能解决问题,就需要follow集了。

    第四章 语法分析-自上而下分析
       特别地,如果SA,则#∈FOLLOW(A)

     LL1符合的条件:

        (1)文法不含左递归

        (2)对于文法中每一个非终结符A的各个产生式的候选式的FIRST集两两不相交。

        (3)对于文法中的每个非终结符A,若它的某个候选首符集包含ε,则

             FIRST(A)∩FOLLOW(A)=Φ

 

4.不带回溯的自上而下分析的方法

        对于LL(1)文法,假设要用非终结符A进行匹配,面临输入符号为a,A的所有产生式为

            A→α1|α2|…|αn

 

            (1)若a ∈ FIRST(αi) ,则指派αi去匹配

            (2)若a不属于任何一个候选首符集,则:

                ①若ε属于某个 FIRST(αi)且a∈FOLLOW(A),则让A与ε自动匹配;

                ②否则,a的出现是一种语法错误

 

5.预测分析程序

 

        预测分析表

            1.1 对每个终结符a,如果a属于FIRST(α),则把该产生式写入到M[A,a]
            1.2若ε属于FIRST(α),则对任何b属于FOLLOW(A), 把该产生式加入到M[A,b]
            1.3所有无定义的M[A,a]标上出错标志

        栈内操作

            2.1若X=a=#,分析成功,停止。E匹配输入串成功.

            2.2若X=a≠#,把X推出栈,再读入下一个符号。

            2.3若X∈Vn,查分析表M。

                a) M[X,a]=   X→UVW

                    则将X弹出栈,将UVW压入

                 注:U在栈顶 (最左推导)

               b) M[X, a] = error   转出错处理

               c) M[X, a] = X-〉ε     ---a为X的后继符号

                   则将X弹出栈 (不读下一符号)

                       继续分析。

 

 

 

课后题

 第四章 语法分析-自上而下分析

        大体看了看课后题,大都是这种类型,起码考察的知识点除了编程之外就都是这些了,开始先将文法换成LL1形式,以便于构造首符集和follow集,然后根据这些写出预测分析表,如果预测分析表没有多重入口,那么 文法符合LL1形式,具体的构造方法都在上述的知识点中体现具体就不在赘述了。

 

感想:

        在写这篇之前,自己看了一下之前写的那一篇,描述知识部分大都是自己的语言,而且还没有分成点来记,造成的后果就是自己有的都看不懂了...所以以后的知识点总结还是按照课本为标准,来总结提炼知识点,课后题我也没有很多的时间一个一个来做,挑的都是些可以基本上概括所有的知识的题目类型,如果没有这种类型的题目可以自己改一下题目要求,自己练习一下,到达能覆盖所有知识点的要求,以便于以后的复习.

相关文章: