一.移进规约
1.思想:用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
2.规约:是指根据文法的产生式规则,把产生式的右部替换成左部符号。
二.规范规约
1.短语2.直接短语3.句柄
三.修建语法树
1.子树:是由该树的某个结点(子树的根)连同它的所有子孙组成。
2.简单子树:只有单层分支的子树(只有父子两代没有第三代)
3.对语法树有如下结论:
1.每个句型都有一棵语法树与之对应
2.每棵语法树的叶结点自左至右排列就组成一个句型
3.每棵子树的叶结点自左至右排列就组成一个短语
4.每棵简单子树的叶结点自左至右排列就组成一个直接短语
5.每棵最左简单子树的叶结点自左至右排列就组成一个句柄
四.算法优先分析法
(1)算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…则我们称该文法为算符文法,也称OG文法
2.构造算符优先关系表
1.通过检查产生式的每一个候选式可以找出满足a=.b(即P→…ab…或P→…aQb…的产生式)
2.为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P)
3.构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
1.若有产生式P→a…或P→Qa…,则aFIRSTVT(P);
2.若aFIRSTVT(Q),且有产生式P→Q…,
则aFIRSTVT(P)。
五.LR分析法
1.LR分析器
LR(0)分析表的构造
LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现。
2.LR文法
一个文法,如果能构造出一个所有条目都唯一的分析表。
LR(k)文法
最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。
我们最感兴趣的是k=0,1
3.活前缀
活前缀特点:
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误
活前缀与句柄间的关系
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)。
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)。
(3)活前缀中全然不包含句柄的任何符号 。
活前缀的识别与LR分析表构造
LR分析表的构造需要构造识别活前缀的有限自动机,
用有限自动机中的状态表示分析表中的状态,
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。
构造识别活前缀的NFA
1、构造文法的所有产生式的项目,每个项目都为NFA的一个状态。
2、确定初态、句柄识别态、句子识别态。
由于S′(起始符)仅在第一产生式的左部出现 ,因此规定起始符相关的项目1为初态
其余每个状态都为活前缀的识别态(终态)
圆点在最后的项目为句柄识别态
第一个产生式的句柄识别态为句子识别态 。
感悟:本章讲的自下而上的语法分析。还学习了规约,算符优先分析等。本章理解起来比较难。用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,所谓自下而上分析法就是从输入串开始,通过“边输入边规约”逐步进行“规约”,直到规约到文法的开始符号,对我来说确实比较难,还需要加强自己的学习。