概述
上一节说到了自上而下分析法,这一节讲解自下而上分析法。
归约和推导
在之前我们提过规约和推导的概念(忘了的小伙伴自行去查看),自下而上的分析法就是”移进——规约”法。由输入的终结符一直推导到文法开始符号。
规范归约
概念定义:
规范规约就是最右推导的逆过程(最左规约)
LR分析法
类别
LR方法的基本思想
方法
LR(0)项目集族&LR(0)分析表的构造
先进行最右推导(逆过程规范归约)
由上到下,活前缀有:
当栈顶出现可归前缀即可归约
可见:
LR分析表的构建
方法1
对于·A,如果输入是A,那么就很开心的变成A·。但如果输入时ε,那么就转到A的状态。(下面NFA中的1到3,1到11,4到9等)
点在最前面,是初态,最后面,是终态
方法2
简单的说,就是,求A的项目,若A展开为· B,则B的项目·γ也加入。
即,对于I,输入a时能识别到的项目的闭包
就是说,能归约的先归约,归约后再分析。
则个定义我不是很能理解,我所理解是:对于当前要输入字符,判断是否能归约,如果能归约的话,对于任何字符,先归约,然后GOTO到下一个状态按照分析表移进或规约;如果不能,移进,到ACTION的下一个状态。
SLR分析表的构造
前提
理解起来,可以这样说,即将输入符号a,如果是下一个符号(即ai),就移进a,如果,a不是ai,但a属于Bi的FOLLOW集,意味着,a是Bi后面的符号,就将α规约成Bi,再接受输入符号。
例
得到DFA
规范LR(LR(1))分析表的构造
SLR分析表解决了归约归约冲突和部分移进-归约冲突。为了进一步解决移进-规约冲突,构造规范LR分析表。
在推导式的最后增加了一个只有在归约时才起作用的下一个搜索字符。表达的意思是,当下一个字符是a是才进行归约。
首先,对于非终结符,不需要移进或规约,执行GOTO。所以有{S‘→·S,#}(设为1式),有1可以得到{S→·BB,#}(设为2式)(因为在1式S后面没有字符,所以得到该式后也为空),由2得到,{B→·aB,a/b BB→·b,a/b}(在2式中,B后面还跟着B,即FIRST(B)=a/b)
规范LR分析表的构造算法
DFA
LALR分析表的构造
LR(1)分析表的问题:代价过高,有很多类似或者相同的项目集,比如:
图中的I3和I6基本一样。
LALR(1)分析表的基本思想:
合并同心项目集之后得到新的DFA:
得到的LALR分析表如下图: