本次笔记内容:
4-8 自底向上的分析概述
4-9 LR分析法概述
4-10 LR0分析
4-11 LR0分析表构造
本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf
本节课介绍了自底向上的分析
,并且举了例子,发现移入-归约分析
存在问题,因此引出了LR分析法
,以LR(0)分析法
为例。在LR(0)分析法
中,最重要的就是构建LR(0)分析表
,基于自动机。这个解决方案不错。但是有时,造表时可能出现一些冲突,导致这个LR(0)分析法
用不了,未来将讲解LSR
和LR(1)
分析法是如何消解冲突的。
文章目录
自底向上的语法分析
- 从分析树的
底部
(叶节点)向顶部
(根节点)方向构造分析树 - 可以看成是
将输入串w归约为文法开始符号S
的过程 - 自
顶
向下
的语法分析采用最左推导
方式 - 自
底
向上
的语法分析采用最左归约
方式(反向
构造最右推导
) - 自底向上语法分析的通用框架:移入-归约分析(Shift-Reduce Parsing)
例:移入-规约分析
逐步分析如图右侧“动作”,很明确;个人理解是从闻法得右侧向左推导。
注意到,每一个蓝色虚线划分的区域中,栈+剩余输入
的内容,总是构成一个相同的“规范句型”。
移入-归约分析的工作过程
在对输入
串的一次从左到右扫描过程中,语法分析器将零个或多个输入符号移入
到栈
的顶端,直到它可以对栈顶的一个文法符号串β进行归约
为止;
- 然后,它将β
归约
为某个产生式的左部; - 语法分析器不断地重复这个循环,直到它检测到一个语法
错误
,或者栈中包含了开始符号且输入缓冲区为空(当进入这样的格局时,语法分析器停止运行,并宣称成功
完成了语法分析)为止。
移入-归约分析器可采取的4种动作
- 移入:将下一个输入符号移到栈的顶端;
- 归约:被归约的符号串的
右端
必然处于栈顶。语法分析器在栈中确定这个串的左端
,并决定用哪个非终结符来替换这个串; - 接收:宣布语法分析过程成功完成;
- 报错:发现一个语法错误,并调用错误恢复子例程。
移入-归约分析中存在的问题
如图,对一个语句 var iA , iB : real
进行分析,最后剩余输入中已经没有任何符号了,而栈中并没有归约出文法的开始符号<S>,因此分析失败。
但是,这个文法其实是合法的句子,那么问题出在:错误地识别了句柄,如上图;应该如下图一样进行分析。
那么,如何避免这种错误?正确识别句柄呢?
将在接下来地LR分析
技术中详细介绍。
LR分析法
- LR文法(Knuth, 1963) 是最大的、可以构造出相应
移入-归约语法分析器
的文法类 -
- L: 对输入进行从
左
到右的扫
- L: 对输入进行从