一.本章重点

     预测分析的程序。

二. 

(1)如何判断一个输入串是否符合语法规则?

           1.从文法的起始符出发进行句子的推导,即自上而下的分析

           2.从句子本身出发,进行归约,看能否把句子规约为到起始符,即自下而上的规约

(2).基本思想

对任何一个输入串,试图用一切可能的办法,从文法的开始符号(根节点)出发,根据文法自上而下地为输入串建立一棵语法树,即为输入串寻找一个最左推导。

(3).自上而下分析面临的问题

1. 文法的左递归问题
2.回溯的不确定性,要求我们将已经完成工作推倒从来,
3.虚假匹配的问题
4.不能准确地确定输入串中出错的位置

5.效率低

三.LL(1)分析法

(1)消除直接左递归

设有产生式
P→Pα|β (1)
其中β不以P开头,α不为ε。那么,我们可以把P的规则改为如下的非直接左递归形式:
P→βP’
P'→αP'|ε (2)

(1)式和(2)式是等价的

(2)消除回溯,提左因子

1.消除回溯的要求

(1)若该候选式匹配成功,那么该匹配不是虚假匹配

(2)若该候选式无法完成最终的匹配任务,则其他任何候选式肯定也无法完成

2.消除回溯的条件

定义FIRST集

令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合:

FIRST(α)={a|α+=>a...,a∈VT}

特别地,如果α  ε,则ε∈FIRST(α)

如果非终结符A的任意两个候选式αi和αj的开始符号集满足FIRST(αi)∩FIRST(αj)=Φ,则A可以根据所面临的第一

个输入符号,准确地指派一个候选式α去执行任务,α是那个FIRST集含a的候选式,即  a ∈FIRST(α)

3.改造文法:提取公共左因子。

(3)LL(1)分析条件

1.定义FOLLOW集

对文法G的任何非终结符A,定义它的后继符号集合:

FOLLOW(A)={a|S+=>...Aa...,a∈VT}

1. 特别地,如果S*=>…A,则#∈FOLLOW(A)
2. FOLLOW(A)集合是所有句型中出现在紧接A之后的终结符号或#所组成的集合

3. 当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时

,只有当a ∈FOLLOW(A),才可能允许A自动匹配

2..不带回溯的LL(1)文法

(1)文法不含左递归
(2)对于文法中每一个非终结符A的各个产生式的候选式的FIRST集两两不相交。即,若
A→α1|α2|…|αn
FIRST(αi)∩FIRST(αj)=Φ (i≠j)
(3)对于文法中的每个非终结符A,若它的某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=Φ

如果一个文法G满足以上条件,则称该文法G为LL(1)文法(第1个L代表从左到右扫描输入串,第2个L代

表最左推导,1表示分析时每一步只看1个符号)

3.不带回溯的自上而下分析的方法
对于LL(1)文法,假设要用非终结符A进行匹配,面临输入符号为a,A的所有产生式为
A→α1|α2|…|αn


(1)若a ∈ FIRST(αi) ,则指派αi去匹配
(2)若a不属于任何一个候选首符集,则:
①若ε属于某个 FIRST(αi)且a∈FOLLOW(A),则让A与ε自动匹配;

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

四.递归下降分析构造程序

1. 当一个文法满足LL(1)条件时,我们就可以构造一个不带回溯的自上而下分析程序,这个分析程序由一组

(可能的)递归程序组成,每个过程对应文法的一个非终结符。这样一个分析程序称为递归下降分析器。

    2.具体做法:对文法的每一个非终结符都编一个分析程序当根据文法和当时的输入符号预测到要用某个非终

结符去匹配输入串时,就调用该非终结符的分析程序。 

五.预测分析程序

1. (1)使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。

(2)实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序

就是属于这种类型的LL(1)分析器。

(3)本节要掌握对给定文法构造出每个非终结符的FIRST和FOLLOW集合。

2.预测分析的过程

(1)LL-自左向右扫描、自左向右的分析和匹配输入串。 所以分析过程表现为最左推导的性质。

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

(2) 符号栈: 有四种情况(1.开始状态2.工作状态3.出错状态4.结束状态)

(3)执行程序

1.把#和文法起始符号E推进栈,并读入输入串的第一 个符a,重复下述过程直到正常结束或出错.

2.测定栈顶符号X和当前输入符号a,执行如下操作:

(1)若X=a=#,分析成功,停止。E匹配输入串成功. 
(2)若X=a≠#,把X推出栈,再读入下一个符号。 

(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弹出栈 (不读下一符号) ,继续分析。 

3.(1)预测分析表的构造——FIRST(X)

1. 若X终结符,则FIRST(X)={X}
2. 若X为非终结符,且有X->a …的产生式,则把a加入到FIRST(X)中;
3.若X->Y…是一个产生式,且Y为非终结符,则把FIRST (Y)-ε加入到FIRST(X)中;

4.若X->Y1Y2Y3….YK,是产生式, Y1Y2Y3….Yi-1是非终结符,而且ε属于 FIRST (Yj)(1<=j<=i-1),则把FIRST (Yj)-ε加入到

FIRST(X)中;如果ε属于所有的FIRST (Yj),则ε加入到FIRST(X)中

(2)预测分析表的构造——FOLLOW(X)

1. 对于文法的开始符,置#于FOLLOW(S)中
2.若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中,

3.若A->αB 是一个产生式,或 A->αBβ是一个产生式,而β-> ε,则把FOLLOW(A)加入到FOLLOW(B)中

(3)预测分析表的构造

对文法G的每个产生式, A->α,进行下面的处理
1.对每个终结符a,如果a属于FIRST(α),则把该产生式写入到M[A,a]
2.若ε属于FIRST(α),则对任何b属于FOLLOW(A), 把该产生式加入到M[A,b]

3.所有无定义的M[A,a]标上出错标志

结论:一个文法G的预测分析表不含多重入口,当且仅当该文法是LL(1)

六.题目应用

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

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

七.总结

这章对我来说理解起来有点费劲,尤其对于定义的理解,还有预测分析这里总是犯迷糊,弄混了。没有一个好的理解方法。

相关文章: