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

预测分析程序的构造

判断是否为合法表达式

预测

当前句型中,出现A,若A有多个产生式,需预测选择哪个产生式,从而可不要回溯,形如 Aα|B

使用的是以下的结构

Markdown

其中左边那个叫做 parsing stack ,右下角那个叫 PPT(predict parsing table) ,最上面的是传送带,是需要检验的表达式左右加上一个哨兵,即 i+ii 是需要检验的表达式, $L$R 都是哨兵

判断 i+ii 是否为一个合法表达式

我们假设有以下的文法: EE+T|TTTF|FF(E)|i

在消除左递归后(消除方法见上节课的笔记),这个文法变成了这样: ETE,E+TE|ϵTFT,TFT|ϵF(E)|i ,注意,此时有递归,但是没有左递归,在 F(E)|i 中,产生式的最左边是 (

下面以刚刚的表达式来举例子。这时我们先拿来一张PPT

Markdown

step 1

Markdown

这是一个标准的开头,将传送带的 $L 压入栈,然后这时候压一个开始符 E

step 2

Markdown

对于刚刚的栈顶元素E ,我们对照传送带的最前面元素 i ,查找PPT中[E,i] ,得 ETE ,于是把step1中的 E 弹出栈,然后从右往左压右边的产生式,即,先压E 后压 T

step 3

Markdown

与step 2做法相同,我们可以得到上图,当然是在step2的基础上查了两次表。此时有左边的栈顶为i 和右边的传送带最前面为 i 。此时可以消去两个i ,输入串指针后移一位,此时变成这样:

Markdown

step 4

此时状态如上图,查[ T,+ ] 有 Tϵ T 出栈

以下省略多步

step 12

Markdown

查[ E,$R ] 有 Eϵ E 出栈

step 13

Markdown

此时消失匹配,验证成功,是合法表达式

如果查表查不到,那么就是不合法的表达式

问题:

如何构造PPT?

构造PPT

First

First(α)={a|α+a,aVT}

更完整的定义:

α=a First(α)={a}

α=ϵ First(α)=ϵ

α=α1α2αn ,

First(α)=First(α1),ϵFirst(α1)(First(α1)ϵ)First(α2),ϵFirst(α2),and ϵFirst(α1)

e.g.

ETE, TFT, Fi

E+TE, TFT, F(E)

Eϵ,Tϵ

First(TE)=First(FTE)=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()GFirst/FollowPPTLL(1)

构造分析树(parsing tree)

ETE

TFT

Fi

Tϵ

E+TE

TFT

Fi

Tϵ

Eϵ

Markdown

附:从语法构造预测分析表(PPT)的过程

语法: EE+T|TTTF|FF(E)|id

步骤:

①消除左递归

ETE, TFT, Fi

E+TE, TFT, F(E)

Eϵ,Tϵ

②计算 First,Follow

附一下PPT

Markdown

现在忽略一下过程直接写一部分结果,具体过程见手写笔记

First(TE)={(,i} ,填入 [E,(],[E,i] 的都是 ETE

Eϵ,Follow(E)={),$R} ,填入 [E,)],[E,$R] 的都是 Eϵ

有此我们可以简单写个公式: AB,{B=ϵ,Bϵ,aFollow(B)aFirst(A),[A,a]AB

当然由于 Follow(B)=Follow(A) ,因此如果为了方便记,可以都用A

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值