编译原理第四章语法分析内容总结


一、学习内容

本章我们主要学习了语法分析的过程,LL(1)分析法和预测分析程序等内容。语法分析是编译过程的核心部分,它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。此处引入是否符合语法规则的判断方法:从文法的起始符出发进行句子的推导,或者从概念上讲,就是要建立一颗与输入串相匹配的语法分析树,即自上而下的分析;从句子本身出发,进行归约,看能否把句子规约为到起始符,即自下而上的规约。第四章主要介绍的是自上而下分析法。自上而下分析存在文法的左递归问题;回溯的不确定性,要求我们将已经完成工作推倒从来;虚假匹配的问题;不能准确地确定输入串中出错的位置;效率低等问题,因此引入LL(1)分析法。

由于自上而下分析方法不允许文法含有任何左递归,所以首先要消除文法的左递归性,假定关于非终结符P的规则为P→Pα|β,可以把P的规则改写为P→βP’;P’→αP’|ε的非直接左递归形式,二者等价。消除回溯需定义FIRST集,令文法G是不含左递归的文法,对G的非终结符的候选α,定义它的开始符号(终结首符)集合FIRST(α)={a|α→a…,a∈VT},特别地,如果α→ε,则ε∈FIRST(α)。对文法G的任何非终结符A,定义它的后继符号集合:FOLLOW(A)={a|S→…Aa…,a∈VT},特别地,如果S→…A,则#∈FOLLOW(A),当非终结符A面临输入符号a,且a不属于A的任意候选式的FIRST集但A的某个候选式的FIRST集包含ε时,只有当a ∈FOLLOW(A),才可能允许A自动匹配。

实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制,预测分析程序就是属于这种类型的LL(1)分析器。LL分析程序分析过程有三部分组成:分析表、执行程序 (总控程序)、符号栈 (分析栈),具体的预测分析表构造过程步骤在知识运用中具体讲解。

二、知识运用

1.执行程序主要实现如下操作:

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

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

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

扫描二维码关注公众号,回复: 1545328 查看本文章

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

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

2.预测分析表的构造——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)中。

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

(1)对于文法的开始符,置#于FOLLOW(S)中;

(2)若A->αBβ, 则把FIRST (β)-ε加入到FOLLOW(B)中;

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

4. 对文法G的每个产生式, A->α,进行下面的处理:

(1)对每个终结符a,如果a属于FIRST(α),则把该产生式写入到M[A,a];

(2)若ε属于FIRST(α),则对任何b属于FOLLOW(A), 把该产生式加入到M[A,b];

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


三、我的感受

第四章总体感觉难度很大,尤其是预测分析程序,预测分析表构造中FIRST集相对好写,FOLLOW集很难分析的完全正确,这方面的内容上课老师也进行了重点的讲解,但仍有部分不懂的知识靠自己看书理解颇费力,还需加强逻辑思维分析能力。本章的知识运用形式较为固定,题型思想基本一致,通过习题的锻炼,我的解题思路逐渐明朗,掌握了基本的解题技巧,解题速度有了较大进步但仍需加强。课程难度的增加提醒我要注意课前预习的重要性,提前对难点有个了解,上课过程中具有针对性的突破难题才是学好课程的核心。

猜你喜欢

转载自blog.csdn.net/xmj1886480/article/details/80012527