编译原理——第五章自下而上语法分析

自下而上语法分析

      

       本章学习自下而上的语法分析,其分析过程为边输入单词符号,边归约,直至归约到文法的开始符号。(归约是指根据文法的产生式规则,把产生式的右部替换成左部符号)自下而上的分析方法的关键就是找到可归约串。

       对于简单问题(不用考虑优先级等问题)的自下而上语法分析有以下方法:1.移进归约,即用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号;2.规范规约,首先了解规范规约的定义,假定α是文法G的一个句子,如果序列αn,αn-1,… ,α0满足:(1)αn=α(2)α0为文法的开始符号,即α0=S(3)  对任何i,0最左端的简单子树)替换成为相应产生式左部符号而得到的。我们称该序列是α的一个规范归约,规范规约即最左归约,可通过修剪最左简单子树实现;3.用符号栈进行自下而上的语法分析,取一个栈作为符号栈在分析开始时,’#’预先进栈,作为栈底符号,将输入串中的符号依次入栈并规约,’#’作为输入串的结束符

      在实际问题中往往能够需要考虑优先级,对于优先级问题有以下处理方法:(1)算符优先分析法,即定义算符之间的某种优先关系,借助这种优先关系找到可归约串并规约。这种优先关系往往是单向的,没有自反性。在算符优先分析法中将最左素短语作为可归纳串(算符优先分析一般不等于规范归约);(2)优先函数法,优先函数是把每个终结符α与两个自然数f(α)与g(α)相对应,使得若α1 <. α2,则f(α1) < g(α2),若α1 =. α2,则f(α1) = g(α2),若α1 >. α2,则f(α1) > g(α2),f称为入栈优先函数,g称为比较优先函数。

      本章还重点介绍了一种分析法——LR分析法。LR分析法是一种规范规约,其思想为一方面记住已移进和归约出的整个符号串,另一方面根据所用产生式推测未来可能碰到的输入符号。LR分析法比较复杂,不适于手工处理,可通过LR分析器实现。LR分析器实质上是一个带先进后出存储器(栈)的确定有限自动机,其核心部分是一张分析表,包括两部分:(1)ACTION[s,a]动作表,规定当状态s面临输入符号a时,应采取什么动作(移进、归约、接受、 报错)(2)GOTO[s,X]状态转换表规定了状态s面对文法符号X时,下一状态是什么。通过LR文法可以构造LR分析表,LR文法是指能构造出一个所有条目都唯一的分析表的文法。最多向前看K个的符号就可以决定动作的LR分析器所分析的文法称为LR(k)文法,对多数程序只需考虑k≤1的情况。考虑LR(0)项目需要了解LR分析法的一个重要的概念,活前缀,活前缀是指规范句型的不含句柄之后的任何符号的前缀。LR分析表的构造需要构造识别活前缀的有限自动机,用有限自动机中的状态表示分析表中的状态,用状态图中的状态之间的转换关系对分析表中的action、goto函数等进行定义。大多数程序设计语言的文法不能满足 LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态)。对于有冲突的状态,向前查看一个符号,以确定采用的动作,构造SLR 分析表。也有一些文法构造的LR(0)项目集规范族存在的动作冲突但是不能用SLR(1)方法解决,此时需要规范LR分析表

习题

1.文法为E→E+T|T     T→T*F|F     F→(E)|i,证明E+T*F是该文法的句型,指出这个句型的所有短语,直接短语和句柄。

解:E→E+T→E+T*F,所以是该文法的句型,

      短语:E+T*F、T*F

      直接短语:T*F

      句柄:T*F

知识点: 句型、短语、直接短语、句柄概念的理解与判断

句型:从开始符号按文法能推出来的语句

短语:由开始符号能推出含非终结符A的句型,A能推出β,则β是句型的短语

直接短语: 能由非终结符仅经过一步推导得出的短语

句柄:最左直接短语

2.文法:S→a|^|(T)

            T→T,S|S

(1)给出(a,(a,a))、(((a,a),^,(a)),a)的最左最右推导

解:

编译原理——第五章自下而上语法分析_第1张图片

(2)写出规范规约及每一步的句柄

解:


知识点:最左推导、最右推导、规范规约

最左(右)推导:总是选择每个句型的最左(右)非终结符进行推导。

规范规约:每次都把句柄替换成相应产生式的左部,即最左规约。

3.

(1)计算上题中文法的firstvt和lastvt

firstvt(S)={a,^,(}        lastvt(S)={a,^,)}

firstvt(T)={a,^,(,,}        lastvt(T)={a,^,),,}

(2)判断文法的优先关系

编译原理——第五章自下而上语法分析_第2张图片

(3)计算文法的优先函数

编译原理——第五章自下而上语法分析_第3张图片

知识点:FIRSTVT(P)、LASTVT(P)、终结符优先关系判断、优先函数 

FIRSTVT(P)={a|P→a…或P→Qa…,a∈VT且Q∈VN}

LASTVT(P)={a|P→…a或P→…aQ,a∈VT且Q∈VN }

优先关系:

a =. b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
a <. b 当且仅当G中含有形如P→…aR…的产生式, 而R     b…或R     Qb…;

a >.b 当且仅当G中含有形如P→…Rb…的产生式,而 R     …a或R    …aQ。

优先函数:

如果优先函数存在,则可以通过以下三个步骤从优先表构造优先函数:(1)对于每个终结符a,令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图。如果a>.b,则从fa画一条弧至gb如果a<.b,则从gb画一条弧至fa 。(2)对每个结点都赋予一个数,此数等于从该结点出发所能到达的结点(包括出发点自身)。赋给fa的数作为f(a)赋给ga的数作为g(a)。(3)检查所构造出来的函数f和g是否与原来的关系矛盾。若没有矛盾,则f和g就是要求的优先函数,若有矛盾,则不存在优先函数。

4.文法

S→AS|b

A→SA|a

(1)列出该文法的LR(0)项目

(2)构造识别活前缀的DFA

编译原理——第五章自下而上语法分析_第4张图片

知识点:LR(0)项目、活前缀、DFA创建

LR(0)项目:在每个产生式的右部适当位置添加一个圆点构成项目。

LR(0)项目集规范族不存在移进-归约,或归约-归约冲突,称为LR(0)文法。只有是LR(0)文法,才能构造相应的LR(0)分析表,才能用LR(0)分析法对句子进行分析。所给文法G的全部项目集为I0--I11。我们将这些项目集的全体称为文法G的LR(0)项目集规范族。C={I0,I1,…,I11},于是,我们所要构造的识别文法G(S)全部活前缀的DFA为:M=(C,V,GO,I0,C)。

构造识别文法活前缀DFA的两种方法:(1)求出文法的所有项目,按一定规则构造识别活前缀的NFA再确定化为DFA。(2)把拓广文法的第一个项目{S′→·S}作为初态集的核,通过求核的闭包和转换函数, 求出LR(0)项目集规范族,再由转换函数建立状态之间的连接关系得到识别活前缀的DFA。

总结

       本章延续上一章的内容,学习语法分析的另一种方式——自下而上的语法分析。学习处理基本问题的移进归约、规范规约和符号栈的使用,处理优先级问题的符号优先算法、优先关系的判断和优先函数的创建。重点讨论了LR(k)分析法k≤1的情况,识别活前缀时与前面的创建确定有限自动机DFA的内容结合,也用到了前面学过的短语、句型等基础概念,知识范围比较广,题目写起来比较复杂,尤其归约和构造识别活前缀的自动机的时候步骤比较琐碎,需要注意。

你可能感兴趣的:(编译原理)