语法分析
本章的语法分析方法与上一章的方法是相反的。上一章节是自上而下的分析,而这一章是自下而上的分析,即从输入串开始,逐步进行归约,将长的输入串归约到文法的开始符号。自上而下分析的关键问题是需要精确定义“可归约串”。这说明归约需要按照一定规则的,要不然可能同一步归约可能有多种归约方法,这就是本章的主要学习内容。
移进归约
移进归约虽然是本章的重点内容,但是比较简单。用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分归约为该产生式的左部符号。归约的核心问题是识别可归约串,但当同一步归约有多种归约方法时,移进归约没有处理这方面的问题,所以提出了规范归约。
规范归约
规范归约是关于是一个最右推导的逆过程,由于规范句型由最右推导推出的句型,故该句型的句柄右边只含有终结符号。
规范归约有三个主要内容,分别为短语、直接短语和句柄。三者是相互联系的,直接短语是短语中可以一步推出来的短语,而句柄是最左边的直接短语。
首先要知道短语是符号串,令G是一个文法,S是文法的开始符号假定αβδ是文法G的一个句型,如果有
则β称是句型αβδ相对于非终结符A的短语。上述两个条件缺一不可。
因为句型是由开始符号推出来的,而短语是由非终结符号推出来的。所以,短语是句型的一部份或全部符号串。
直接短语是短语中的一部分。如果有A→β,则称β是句型αβδ相对于规则有A→β的直接短语。
句柄一个句型的最左直接短语称为该句型的句柄。
例题分析 习题一
短语、直接短语和句柄
第一步证明是否是文法的句型,即能否由已知产生式推出所求句型,对于短语、直接短语和句柄直接套定义就可以求出,详细步骤在下面的解答中。
习题二 (2)第一部分
规范归约和每一步句柄
从给出的句型的最左侧开始,先找出句柄,然后进行归约(即通过文法产生式将产生式右侧的字符或字符串换成产生式左侧的字符)。对于每一步都进行同样的操作,最后规约成开始符号。详细步骤如下:
用符号栈进行自下而上的语法分析
栈是语法分析的一种基本数据结构。
’#’的使用
(1)在分析开始时,将’#’预先进栈,作为栈底符号
(2)将’#’作为输入串的结束符
即分析开始时的格局为
自左向右对输入串ω不断向栈中进行移进—归约,直到形成如下格局
表示分析成功,否则意味着输入串ω有错
例题分析 习题二(2)第二部分
移进——归约
“#”作为栈顶和栈底符号,一步步将输入串压入栈,遇到可以归约的按照规范归约方法进行归约,最后栈内所剩的除“#”以外的符号就是所求结果。分析如下(下列图一中的输入串结尾忘记写“#”):
算符优先分析法
定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约
定义两个终结符‘a’与‘b’的优先关系
a =.b 表示a的优先性等于b
a >.b 表示a的优先性大于b
a <.b 表示a的优先性小于b
注意:
=. >. <. 不同于数学上的 = < >
a =.b 不一定对应着 b =. a
a >.b 不一定对应着 b <. a
a <.b 不一定对应着 b >. a
算符优先文法及优先表构造
算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法,也称OG文法 (Operater Grammar) 。
约定:
a、b代表任意终结符;
P、Q、R代表任意非终结符;
‘…’代表由终结符和非终结符组成的任意序列,包括空字
定义终结符之间的优先关系
假定G是一个不含e产生式的算符文法。对于任何一对终结符a、b,我们说:
1. a =. b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2. a <. b 当且仅当G中含有形如P→…aR…的产生式, 而R b…或RQb…;
3. a>.b 当且仅当G中含有形如P→…Rb…的产生式,而 R…a或R…aQ。
如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a=.b
a>.b
a<.b
则称G是一个算符优先文法(OPG文法)。
构造算符优先关系表
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
(1)假定有个产生式的一个候选形为
...aP...
那么,对任何bÎFIRSTVT(P),有a <. b。
(2)假定有个产生式的一个候选形为
...Pb...
那么,对任何aÎLASTVT(P),有a >. b。
例题分析 习题三
FIRSTVT集和LASTVT集的构造 优先关系
FIRSTVT集和LASTVT集的构造根据上面的两个公式就可以推出,但是理解有一点难度,所以需要根据例题去分析理解。优先关系根据下列公式求出:
1. a =. b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2. a <. b 当且仅当G中含有形如P→…aR…的产生式, 而R b…或RQb…;
3. a>.b 当且仅当G中含有形如P→…Rb…的产生式,而 R…a或R…aQ。
具体分析如下:感想:
这一章的内容还是比较多的,新概念多而且有些还难以理解。在课上有很多内容没有理解,所以只能重新看了一遍课件,然后结合课后题去理解。通过做题理解概念是比较适合我的方法。本章的重点是利用符号栈进行自下而上的语法分析,算符优先算法的设计,以及LR分析法。对于前一部分内容我认为还是能够掌握的基本内容的,后面的LR分析法还没有完全理解,所以还需要多加练习。
相关阅读
本文通过学习王博俊、张宇的《DIY Compiler and Linker》 ,实现语法分析器,一方面作为自己的学习笔记,一方面也作与大家分享与交流