您的位置:首页 > 其它

编译原理与编译构造 预测分析程序的构造

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐