编译原理第五章语法分析――自下而上分析内容总结

匿名 (未验证) 提交于 2019-12-03 00:18:01
本章主要学习以自下而上的方法进行语法分析,自下而上的分析是一种归约的算法,感觉比上一章的难度有所加大,理解起来也比较的困难。首先规约的基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。

自下而上分析过程:边输入单词符号,边归约。其核心问题是识别可归约串。

一、知识点

一、短语:定义:G是一个文法,S是文法的开始符号,假定abd是文法G的一个句型

α,β,d∈(VNVT)*A∈V,如果有

b称是句型abd相对于非终结符A的短语

2.直接短语:特别是,如果有Ab,则称b是句型abd相对于规则Ab直接短语

3.句柄:一个句型的最左直接短语称为该句型的句柄

是一个非常重要的方法,其分析过程是自左向右对输入串ω不断向栈中进行移进――归约。

二、算符优先分析法

1、定义两个终结符‘a’与‘b’的优先关系
a >.b

a <.b

2、算符优先文法及优先表构造

算符优先文法

(1)算符文法

定义:一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:

则我们称该文法为算符文法,也称OG文法。

(2)定义终结符之间的优先关系

1. a =. b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;


…a或R…aQ。

(3)如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a=.b
a>.b
a<.b

构造算符优先关系表

(1)通过检查产生式的每一个候选式可以找出满足a=.b

(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P)



(3)构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
① 若有产生式P→a…或P→Qa…,

② 若aFIRSTVT(Q),且有产生式P→Q…,

则aFIRSTVT(P)。

(4)同理构造构造集合LASTVT(P)的算法
按其定义,可用下面两条规则来构造集合LASTVT(P):
① 若有产生式P→… a或P→… aQ ,
则aLASTVT(P);

则aLASTVT(P)。

(5)有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
①假定有个产生式的一个候选形为

FIRSTVT(P),有a <. b。
②假定有个产生式的一个候选形为
…Pb…

LASTVT(P),有a >. b。

注意:
对于‘#’号,相当于在文法开始符号S前加一个额外的开始符号,比如为Z

然后,把

Z →#S#

添加到原文法中,再进行分析。

三、符号栈的使用与语法树的表示

今后我们将用一个不属于文法符号的特殊符号‘#’作为栈底符,即在分析开始时预先把它推进栈;同时,也用这个符号作为输入串的“结束符”,即无条件地将它置在输入串之后,以示输入串的结束。

指发现栈顶呈可归约串,并用适当的相应符号去替换这个串(这两个问题都还没有解决)。

指宣布最终分析成功,这个操作可看作是“归约”的一种特殊形式。

指发现栈顶的内容与输入串相悖,分析工作无法正常进行,此时需调用出错处理程序进行诊察和校正,并对栈顶的内容和输入符号进行调整。

四、LR分析法


三、课后题

四、总结
我认为本章的重点就是掌握利用符号栈进行自下而上的语法分析,算符优先算法的设计,以及lr分析法。本章的概念很多,有一些概念我理解的不是很透彻,只是背过了会用但是并不理解,我觉得这样的学习会容易忘,所以还是要多看几遍课本的,注重复习。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!