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

本文介绍如何构造预测分析程序,包括预测分析表(PPT)的构建方法及步骤,并通过实例演示了如何判断一个表达式是否合法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预测分析程序的构造

判断是否为合法表达式

预测

当前句型中,出现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}

更完整的定义:

α=aFirst(α)={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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值