预测分析程序的构造
判断是否为合法表达式
预测
当前句型中,出现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
这是一个标准的开头,将传送带的
step 2
对于刚刚的栈顶元素
step 3
与step 2做法相同,我们可以得到上图,当然是在step2的基础上查了两次表。此时有左边的栈顶为
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 ,
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