自下而上语法分析
- 两种语法分析对比
- 自下而上语法分析(Bottom-up)
- 核心思想 - (移进-规约)
- 移进 : 移进到栈里,当形成产生式时就弹出(规约)
- 规约 : 右部符号替换为左部符
- 移进-规约 例题
- 核心问题 - 识别可规约串 (短语)
- 直接短语
- 句柄 : 一个句型的最左直接短语
- 短语和直接短语的例题
- 分析过程描述
- 分析方法
- 算符优先分析法
- 算符优先分析法 - 表达式分析
- 优先关系
- 算符文法 - 不会出现连续的非终结符的文法
- 构造优先关系表
- 优先级相等
- 优先级低和优先级高 - FIRSTVT集合和LASVT集合
- 构造FIRSTVT(P)的算法
- 构造LASTVT(P)的算法
- FIRSTVT的计算
- LASTVT的计算
- 构造优先关系表
- 算符优先分析算法
- 最左素短语
- 最左素短语定理
- 算符优先分析结果 != 语法树
- LR分析法 - 规范归约的过程
两种语法分析对比
自下而上语法分析(Bottom-up)
核心思想 - (移进-规约)
移进 : 移进到栈里,当形成产生式时就弹出(规约)
规约 : 右部符号替换为左部符
规约:右部符号替换为左部符号
原式:i*i+i 规约后 : E
从下往上合并的过程
右部符号i 替换为 左部符号E
移进-规约 例题
当规约过程中,有多重选项,这个时候我到底哪个规约哪个不规约 - 核心问题 :识别可规约串
核心问题 - 识别可规约串 (短语)
β可以由非终结符A多步推出
αβ△是一个句型,当β由A替换后,αA△仍然是一个句型
此时称呼β是αβ△相对于A的短语
子串能够向上规约成一个非终结符号A
这个非终结符A 和上下文一起 仍然是一个句型
直接短语
β由A一步推出,那么β是αβ△的直接短语
句柄 : 一个句型的最左直接短语
短语和直接短语的例题
已知文法和句型,写出对应的短语和直接短语
先按照句型格式展开对应文法 ,套定义进行判断
以某结点为根的树,末端从左往右 就是短语
子树只有两代,该短语就是直接短语
分析过程描述
分析方法
算符优先分析法
算符优先分析法 - 表达式分析
算符优先分析法: 按照 算符的优先关系 和结合性质进行语法分析
存在问题 : 归约顺序不同,构造出的语法树不同,计算顺序不同,结果不一样
解决: 设定算符的优先顺序,使得归约过程唯一
左侧的文法 : 需要时刻记住先乘除后加减的优先级
右侧的文法: 蕴含了算符的优先级,直接无脑展开即可
自下而上 : 右边的 凑对后 = 文法左边的式子
优先关系
+<·+ 左边加号的优先级比右边加号的优先级要低
算符文法 - 不会出现连续的非终结符的文法
算符文法 : E+
不是算符文法:EF
算符优先文法
a优先级与b相同: ab,或者aQb是一起归约到P上去
- P-> …ab…
- P-> …aQb…
eg : (E) 推导出 左括号和右括号的优先级相等,符合 aQb型
a的优先级低于b :
- P-> …aR… R=>b…
- P-> …aR… R=>Qb…
eg: E->E+E E=>E*E ∴ + <· * 加号优先级低于乘号优先级
先归约a后面的 ,然后再用这个整体来和a归约
a的优先级高于b:
- P->…Rb… R=>…a
- P->…Rb… R=>…aQ
优先级高的先归约
eg: E->E × E E=>E+E ∴ + ·> × 推理出加号的优先级高,这与第二个例子推出的相矛盾
算符优先文法 : 推理的关系不存在矛盾的情况
文法G中任何终结符对(a,b) 只满足优先级相等, a优先级高,a优先级低着三个关系之一 - 称G位算符优先文法
…ab… 相等关系
…aR… + R->b… =>…ab…或者aQb… a<·R(b)
…Rb… + R->…a => …ab… 或者…aQb… R(a)·>b
算符优先文法例题
构造优先关系表
优先级相等
检查 优先级相等 无需检查推导式,只需检查所有候选式是否满足ab 或者aQb
优先级低和优先级高 - FIRSTVT集合和LASVT集合
VT :非终结符
P能推理出a…或者Qa… 那么a可以进入这个FIRSTVT§ : a在首位12位置
P能推理出…a或者…aQ,那么a可以进入这个LASVT§ : a在末尾12位置
构造FIRSTVT§的算法
具体实现 : 栈 + 数组
构造LASTVT§的算法
FIRSTVT的计算
划首位两个元素
LASTVT的计算
划末尾两个元素 不断循环 直到没有新的元素进入集合
构造优先关系表
算符优先分析算法
自下而上的核心 : 识别可归约串 - 素短语
最左素短语
短语 : 任何子树两层或两层以上的末端 连接起来
直接短语 : 两层子树末端
素短语: 包含终结符的短语 , 且 内部没有比他更小的素短语
最左素短语 : 最左边的素短语
可以通过语法树知道最左素短语,但是语法树也是需要推导的最终结果,所以不能依赖语法树
最左素短语定理
最左子串 : 最左的终结符 优先级 比 外面的aj-1要高, 内部的终结符优先级都相等, 最右的终结符 优先级 比 ai+1 要高
这个红色的子串 就是 最左素短语
Njaj…NiaiNi+1 这一串 就是 最左素短语
算符优先分析结果 != 语法树
LR分析法 - 规范归约的过程
规范归约:句柄作为可归约串
L : 从左到右扫描输入串
R : 自下而上进行归约
句柄和规范归约
用句柄归约
规范归约 - 结果是语法树
规范句型