编译原理与编译构造 预测分析程序的构造
2017-10-27 22:31
549 查看
预测分析程序的构造
判断是否为合法表达式
预测当前句型中,出现A,若A有多个产生式,需预测选择哪个产生式,从而可不要回溯,形如A→α|B
使用的是以下的结构
其中左边那个叫做parsing stack ,右下角那个叫PPT(predict parsing table) ,最上面的是传送带,是需要检验的表达式左右加上一个哨兵,即i+i∗i 是需要检验的表达式,$L、$R 都是哨兵
判断i+i∗i 是否为一个合法表达式
我们假设有以下的文法:E→E+T|TT→T∗F|FF→(E)|i
在消除左递归后(消除方法见上节课的笔记),这个文法变成了这样:E→TE′,E′→+TE′|ϵT→FT′,T′→∗FT′|ϵF→(E)|i ,注意,此时有递归,但是没有左递归,在F→(E)|i 中,产生式的最左边是(
下面以刚刚的表达式来举例子。这时我们先拿来一张PPT
step 1
这是一个标准的开头,将传送带的 $L 压入栈,然后这时候压一个开始符E
step 2
对于刚刚的栈顶元素E ,我们对照传送带的最前面元素i ,查找PPT中[E,i] ,得E→TE′ ,于是把step1中的E 弹出栈,然后从右往左压右边的产生式,即,先压E′ 后压T
step 3
与step 2做法相同,我们可以得到上图,当然是在step2的基础上查了两次表。此时有左边的栈顶为i 和右边的传送带最前面为i 。此时可以消去两个i ,输入串指针后移一位,此时变成这样:
step 4
此时状态如上图,查[T′,+] 有T′→ϵ ,T′ 出栈以下省略多步
step 12
查[E′,$R] 有E′→ϵ ,E′ 出栈
step 13
此时消失匹配,验证成功,是合法表达式
如果查表查不到,那么就是不合法的表达式
问题:
如何构造PPT?
构造PPT
First
First(α)={a|α⇒+a⋯,a∈VT}更完整的定义:
α=a 则First(α)={a}
α=ϵ 则First(α)=ϵ
α=α1α2⋯αn ,First(α)=⎧⎩⎨⎪⎪⎪⎪First(α1),ϵ∈First(α1)(First(α1)−ϵ)⋃First(α2),ϵ∈First(α2),and ϵ∉First(α1)⋯
e.g.
E→TE′, T→FT′, F→i
E′→+TE′, T′→∗FT′, F→(E)
E′→ϵ,T′→ϵ
First(TE′)=First(FT′E′)=First(F)={i,(}
遇到一个问题:对ϵ 产生式,如何处理?即A→α|ϵ
用Follow(A) 解决ϵ 产生式
Follow
S⇒+⋯Aa⋯ 在句型中,跟在A之后的VT 就是Follow(A)求解:观察产生式中的右部
B→αAβ
① 当β⇏+ϵ ,Follow(A)=First(β)
② 当β⇒+ϵ ,{β推不出空,Follow(A)β推出空,Follow(A)=First(β)−ϵ=Follow(B)
e.g.
Follow(E′)=Follow(E)⋃Follow(E′)=Follow(E)={$R,)}
注意一下,这里我们人为加了一个$R
Follow(T′)=Follow(T)⋃Follow(T′)=Follow(T)={First(E′)−ϵ}⋃Follow(E′)={+}⋃{$R,)}={+,$R,)}
LL(1)文法
第一个L:从左向右扫描第二个L:最左推导
1:one character under reader,一次读一个字符
(1)有没有LL(0)?可能有
有没有LL(2)?有,复杂度更高
(2)LL(1)文法的约束条件:
①不能出现公共左因子
②不能有左递归
③不能有二义性
CFG(上下文无关文法)⇒预处理G′⇒First/FollowPPT⇒LL(1)
构造分析树(parsing tree)
①E→TE′②T→FT′
③F→i
④T′→ϵ
⑤E′→+TE′
⑥T→FT′
⑦F→i
⑧T′→ϵ
⑨E′→ϵ
附:从语法构造预测分析表(PPT)的过程
语法:E→E+T|TT→T∗F|FF→(E)|id步骤:
①消除左递归
E→TE′, T→FT′, F→i
E′→+TE′, T′→∗FT′, F→(E)
E′→ϵ,T′→ϵ
②计算 First,Follow
附一下PPT
现在忽略一下过程直接写一部分结果,具体过程见手写笔记
First(TE′)={(,i} ,填入[E,(],[E,i] 的都是E→TE′
E′→ϵ,Follow(E′)={),$R} ,填入[E′,)],[E′,$R] 的都是E′→ϵ
有此我们可以简单写个公式:A→B,{B=ϵ,B≠ϵ,∀a∈Follow(B)∀a∈First(A),[A,a]内填的内容是A→B
当然由于Follow(B)=Follow(A) ,因此如果为了方便记,可以都用A
相关文章推荐
- 编译原理学习笔记12——(魔镜魔镜告诉我—— 构造预测分析程序)——2014_1_28
- 编译原理-用Bison构造语法分析程序-小小计算器
- 编译原理学习笔记05——(识别孙悟空72变之魔鬼特训—递归下降分析程序构造)——2014_1_20
- 编译原理-用Bison构造语法分析程序-二进制转换十进制
- 编译原理学习笔记11——(三个臭皮匠顶上—— 构造预测分析表)——2014_1_27
- 编译原理 实验1 词法分析程序的构造
- 吉首大学_编译原理实验题_基于预测方法的语法分析程序的设计【通过代码】
- 关于Basic程序解释器及编译原理的简单化(1)---Basic器的语法分析及主要代码
- 编译原理_pl0程序分析及注释
- VC编译下对一个超简单的缓冲区溢出程序的原理解析以及c程序的汇编分析
- 关于Basic程序解释器及编译原理的简单化(1)--词法分析和代数式求值
- 编译原理之算符优先分析语法程序
- 编译原理之算术表达式文法的预测分析算法c实现
- 编译原理---(预测分析first,follow)
- 吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】
- 编译原理笔记6 词法分析程序
- 编译原理语法分析对循环语句和条件判断语句编写词法分析编译程序,只能通过一遍扫描完成
- 编译原理 实验3 递归下降语法分析程序设计
- 编译原理-词法分析01-扫描程序
- 编译原理(五) LL(1)文法分析法(预测分析表的构造算法C++实现)