编译原理-至下而上的语法分析
至下而上分析的基本问题
归约
用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左部符号
输入符号串:
归约过程
例子:设文法G(S):
${b->d}
能进行归约就进行归约不能进行归约进行移进
此时我们进行归约的话就会出现矛盾,b是第二个推导的产生式,Ab是第二个产生式的候选式,这里我们选择第二种进行归约
在不能归约时我们就移进
短语
定义:令G是一个文法,S是文法的开始符号,假定
就称
如果有直接短语
,一个句型的最左直接短语称为该句型的句柄
一个句型对应的语法树中
- 以某非终结符为根的两代以上的子树的所有末端结点从左到右排列就是相对于该非终结符的一个短语
- 如果子树只有两代,则改短语是直接短语
句柄
可以被用来对句子进行归约
规范归约
定义:假定
是
规范推导
:我们将规范归约的过程逆过来就是规范推导,规范推导也经常被称为最右推导
由规范推导推出来的句型被称为规范句型
符号栈的使用
- 栈是语法分析的一种基本数据结构,
作为栈底符号
文法
输入串为 的分析过程
算符优先分析
- 算符优先就是定义算符之间(终结符之间)的某种优先关系,借助优先关系来寻找可归约串和进行归约
考虑二义文法
这个句子由几种不同的规范归约
例如句子 的规约过程(按四则运算的优先顺序)
优先关系
算符文法及优先关表构造
算符文法
:一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
约定:
"等于"
:
"小于"
:
"大于"
:
FIRSTYT
:
LASTVT
:
比较:
算符优先关系表
有了FIRSTVT
和LASTVT
这两个概念后,我们就可以用算法构造优先关系表
我们只需对每个产生式检查一遍,把所有优先关系都找到就可以了
如何求FIRSTVT和LASTVT
算符优先分析算法
素短语
:至少包含一个终结符,并且除了它自身外不包含任何更小的素短语,最左素短语就是句型最左边的素短语
我们考虑句型:
其中每一个
一个算符优先文法G的任何上述句型的最左素短语是满足如下条件的最左子串
算法
:
优先函数
我们在通常实现上面算法的时候在判断优先关系的时候一般不采用查表的方法而是用两个优先函数,优先函数可以将原来
f被称为栈优先函数
g被称为比较优先函数
如何构造优先函数(证明过程略)
经过构造完的优先函数需要我们进一步检验是否正确
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2022-11-13 总结