自下而上的分析过程核心就是 : 识别可归约串(也就是当栈顶有好几种规约方式时我是选择哪一个式子进行规约)
短语与直接短语
短语就是这几个叶节点向上增长后会生长到同一个节点,那么这几个叶节点就构成一个短语
一个句型的最左直接短语称为该句型的句柄
规范规约:每次都规约句柄的规约(也叫最左规约)
最右推导称为规范推导,由规范推导得到的句型称为规范句型
如果文法G是无二义的,那么规范推导的逆过程必是规范规约
自下而上语法分析过程
算符优先分析
算符优先分析未必是严格的最左规约,也就是说算符优先分析不是一种规范规约
FIRSTVT集合与LASTVT集合
素短语
算符优先分析算法
对于文法的句子来说,算符优先分析的结果不一定就是语法树
因为算符优先分析并不是要求非终结符一一对应的,所以说可能识别一些错误的句子
LR分析法
句柄
规范规约
αi 意思是 每一步规约得到的那个句子
规范规约得到的结果就是语法树,而算法优先分析得到的结果不一定是语法树,算符优先算法不属于规范规约
规范规约过程中得到的每一个句型都是规范句型
LR分析
那么规范规约关键的问题就是寻找句柄,所以LR分析器需要具备这样的功能:判断分析栈栈顶的是不是句柄,如果是句柄就把句柄弹出然后压入新规约的东西进去,那么LR分析器又是如何判断栈顶的是不是句柄那?这主要是依赖于历史,展望,现实这三个部分
goto表是在把规约后的非终结符压入栈中查他的状态时用的
我们用一个三元组的形式来描述LR分析的过程
LR文法
LR分析表的构造
活前缀与构造识别活前缀DFA
之所以叫做活前缀,是因为对每个活前缀再给其右边添加上几个符号就可以形成一个规范句型进行规约
A -> X . YZ 表示在A的识别过程中,已经识别了X了,下面我们期待识别Y和Z
. 左边的是我们已经看到形成的 . 右边的是我们期待形成的
. 在候选式最右边的项目 叫做 归约项目 ,代表我们整个候选式已经分析识别了
S’ -> α (拓广后的文法符号 S’ 的这个唯一的项目叫做接受项目,表示整个串接受分析完毕)
下图红框框,框起来的集合都是一个项目集,这些项目集构成了项目集规范族
LR分析表的作用就是指导LR分析过程始终满足这个DFA的要求,始终保持栈里面是活前缀
通过计算项目集规范族构造识别活前缀的DFA
对于上图,比如说 从状态0 出发 识别了个b 又识别了个c , 那么状态5里面的这三个项目就是对于活前缀 bc 是有效的
构造LR(0)分析表
SLR(1)分析法
可以看到上图只有第二步有区别, SLR多展望了一个字母
LR(1)分析
那个 A -> α . β 是 LR0项目,然后再加上 a1a2…ak 这些终结符构成的串