自下而上的分析法(笔记) b站课堂:BV11t411V74n?p=18
基本思想:
从输入串开始,逐步进行归纳,直到文法的开始符号
归纳:根据文法的产生式规则,把产生式的右部替换成左部符号。
从树末端开始,构造语法树
归约相关概念:
规范归约和最右推导,前者从右到左,后者从左到右,两者互为逆过程
只有规范归约出来的句型才能叫归约句型
采用 移进-归约 的方法(使用符号栈,以#开始或者结尾)
符号栈的使用例子:
句柄 就是可归约串
在符号栈里,一旦栈顶出现句柄就进行归约
符号栈的内容和剩下的输入串一定构成一个归约句型
归约核心还是关于句柄的可归约算法。关键在于句柄的判断和选择才能进行归约,才能有效形成语法分析树
可归约算法:
算符优先分析法:
按照算符的优先关系和结合性质进行语法分析
适合分析表达式
基本思想:
起决定作用的是相邻的两个算符(终结符)之间的优先关系。所谓算符优先分析法就是定义算符之间的某种优先关系,借助于这种关系寻找可归约串进行归约。
优先关系的定义:定义任何两个可能相继出现的终结符a与b的三种优先关系(与顺序有关,a一定出现在b的左边,且a、b相邻)
相关概念添加:
例子:
说明:空意味着不能连续出现,列为左边先出现
构造FIRSTVT(P):
同理,LASTVT(P)也是如此。
例子:
素短语概念:
最左素短语:句型最左边的素短语
注意
算法优化:
事实上优化了查表的速度,空间 。
有些优先关系表没有优先函数,例子:
优先函数存在,但不唯一(大小关系确定但是数的大小可以+常量,所有有无数个)
构造方法:
证明:
算法实际思想:根据非终结符的优先关系寻找最左素短语进行归约,其中可以使用优先函数进行优化。
LR分析法:
规范归纳
基本思想:
规范归约的关键也是寻找句柄:要从历史(已经一如栈的内容)、展望(根据产生式预测的输入)和现实(当前输入的符号)进行操作。
下面从优先表的使用再到优先表的产生进行实现LR分析法。
LR分析方法(优先表就是LR分析程序中进行分析的依据):
LR分析表例子:
Action中以S开头的,以r开头的
acc结束
以分析表具体分析过程例子:
示例:见视频
相关概念:LR(K)文法
LR文法真包含于无二义文法。
👇LR优先表的产生:
首先继续明确一下句柄在栈的体现:
相关概念:子的前缀,活前缀
产生优先表的思想: 使用一个DFA使得栈中始终是活前缀
相关概念:
对于每个产生式都可以构造对应的项目,所有的项目可以形成一个NFA,都可以改进成如下的黄图
,只有项目有效就可以进行形成句柄
但是,有时候可能有多个接受项目,所以需要改进 ,例子如下,对于bc,三个项目都有
改进:
使用闭包
小结: