编译技术图式(第四章 语法分析)03自下而上的语法分析
模型类型笔记
1、引入
有向:从左到右
手动模式:
- 最右推导的逆过程
- 将点后单个字符移入工作区
- 点在加点表达式移动的过程
补充知识:
- 加状态栈的目的:分析时不用重启自动机
- 句柄是工作区最右侧的某几个符号(点所在表达式的点左侧)
- =》*,=》+任意步数
- LR(0)不一定是最左规约,但一定是最右推导逆过程
- LR(0)文法的生成表s,r在一个格里成为移进冲突,不能允许,求follow集除去r
- LR(0)文法文法改造
- 加一个接受项目S->E的文法改造(拓广文法),如有就无改造
- 对左递归和公共左因子无所谓,无需改造
2、LR(0)文法
(1)构建(确定)有限自动机
1)求有限自动机
- 构成每个新框图的产生式
- 识别的原串(带点)
- 点后非终结符的相关产生式(点在箭头后)
- 每个框图间由箭头连接,识别单字符后进入新框图
- 同类框图不需要再建立
2)分析
- 读入字符,对应的自动机标号也压入堆,进入下一个框图
- 自动机到头,则句柄被识别弹出,弹出字符数由句柄长度决定,对应规约的非终结符压入堆;同时对应的自动机框图的标号弹出和压入
- 最后成功则为S,框图标号为0
3)为了让计算机识别,用LR(0)分析方法表示
自动机转为表格表示(自动机內部产生式信息丢失)
- action表
- goto表
- acc:遇到#号完结
- S:shift,因T、E等非终结符是因为规约,不写shift
- r:Redue规约
- r后数字是产生式序号
3)改进:LR(0)—> SLR(1)
0指的是规约不向后看,1指往后看一个
E的fellow集,第四行除了fellow集中的“)”和“#”的r2都去掉(因为E后只能接)和#,否则都错误)
4)LR分析总结
3、文法相关概念
- 短语
- 通过树理解短语
- 句型:推导树的叶节点自左至右连接
- 短语:子树的边缘时相对于根的短语(根是相对的)
- 直接短语:有且仅有两层的子树的短语
- 句柄:最左的有且仅有两层的子树边缘(根是绝对的)
- 短语定义:
- 通过树理解短语
- 规范句型:由规范(最右)推导推出的句型
-
栈中符号与未分析的串连在一起,可由最右推导得出
-
- 活前缀:栈中符号为“规范句型”的前缀(从最左开始),且该前缀绝不含有句柄右边的符号(可能不包含/包含部分/不包含句柄)
- 项目
- 项目:在产生式右部添加一个圆点(原带点表达式)
-
活前缀与项目的关系:项目的有效性
- 有效项目集:对活前缀δα有效的项目的集合(原框图)
-
LR(0)项目集规范族: 文法G所有“有效项目集” 的集合(原自动机)
- 项目集上的闭包运算:closure(I)(即不写自动机,换一种写法)
- 文法改造:拓广文法(如有S->,则不进行改造)
- 然后构造action表和goto表
- 两种冲突:规约/规约冲突,移进/规约冲突,用SLR(1)文法
- 分析能力, LR(1)最强, LALR(1)次之, SLR(1)再次,LR(0)最弱