参考哈工大课件
自底向上的语法分析
从分析树的底部(叶节点向顶部根节点方向构造分析树,可以看成是将输入串归约为文法开始符号S的过程
自顶向下的语法分析采用最左推导方式;
自底向上的语法分析采用最左归约方式,实际上是 反向构造最右推导
自底向上语法分析的通用框架:移入-归约分析
1)在对输入串的一次从左到右扫描过程中,语法分析器将零个或多个输入符号移入到栈的顶端,直到它可以对栈顶的一个文法符号串β进行归约为止
2)它将β归约为某个产生式的左部
3)语法分析器不断地重复这个循环,直到它检测到一个语法错误,或者栈中包含了开始符号且输入缓冲区为空(当进入这样的格局时,语法分析器停止运行,并宣称成功完成了语法分析)为止
注意:每步规约都是规范规约,每次规约“句柄”
移入-归约分析器可采取的4种动作:
- 移入:将下一个输入符号移到栈的顶端
- 归约:被归约的符号串的右端必然处于栈顶。语法分析器在栈中确定这个串的左端,并决定用哪个非终结符来替换这个串
- 接收:宣布语法分析过程成功完成
- 报错:发现一个语法错误,并调用错误恢复子例程
移入-归约分析中存在的问题
造成错误的原因:错误地识别了句柄
LR分析法概述
LR文法是最大的、可以构造出相应移入-归约语法分析器的文法类
L: 对输入进行从左到右的扫描
R: 反向构造出一个最右推导序列
LR(k)分析:需要向前查看k个输入符号的LR分析。当省略(k)时,表示k =1
- LR 分析法的基本原理
自底向上分析的关键问题是:如何正确地识别句柄。
句柄是逐步形成的,用“状态”表示句柄识别的进展程度
LR分析器基于这样一些状态来 构造自动机进行句柄的识别
例:S→bBB
S→·bBB 移进状态
S→b·BB / S→bB·B 移进、待归约状态
S→bBB· 归约状态
注意: 产生式A→ε 只生成一个项目A→ ·
- LR 分析器(自动机)的总体结构
LR 分析表的结构:
- sn:将符号a、状态n 压入栈
- rn:用第n个产生式进行归约
例:文法
① S→BB
② B→aB
③ B→b
输入bab#
栈 | 状态 | 剩余输入 | 动作 |
---|---|---|---|
0 | # | bab# | |
04 | #b | ab# | 0和b比较s4,移入b,添加4 |
02 | #B | ab# | 4和a比较r3,归约文法B→b右部长度1,在符号栈和状态栈中分别移出1个符号,在符号栈中进入B。此时栈顶是0,遇到刚规约出的B,到状态2,添加2状态 |
023 | #Ba | b# | 2和a比较s3,移入a, |