【编译原理】自上而下的语法分析之预测分析法

来源:互联网 发布:家庭记账软件免费版 编辑:程序博客网 时间:2024/05/17 05:57

最近学习了LL(1)文法的预测分析法,这种方法不同于递归下降分析法,可直观通过栈查看语法分析过程,现总结如下.


1. 定义

第一个L表示从左到右扫描输入串,第二个L表示最左推导,1表示每步只需向前看一个符号。

LL(1)文法定义:
对于文法的任意两个不同的产生式A->α|β:
–不存在终结符号a使得α和β都可以推导出以a开头的串。
–α和β最多只有一个可以推导出空串。
–如果β可以推导出空串,那么α不能推导出以FOLLOW中任何终结符号开头的串;

定义等价于以下定理:

定理:若满足以下条件,则B N F中的文法就是LL(1)文法:

1. 在每个产生式A→a1 | a2 | . . . |an 中,对于所有的i 和j:1≤i,j≤n,i≠j,First (ai )与First (aj )交集为空。
2. 若对于每个非终结符A都有First (A) 包含了ε,那么First (A)与Follow (A)交集为空。


2. 预测分析表

使用预测分析法需要首先构造预测分析表,构造之前需要构造文法的First集与Follow集, 其定义如下:

(1) First定义:
令X为一个文法符号(可以是terminal也可以是nonterminal)或ε,

则集合First(X)由terminal组成,此外可能还有ε,它的定义如下:

1.若X是terminal或ε,则First(X)={X}。

2 若X是nonterminal,则对每个产生式X—>X1X2.....Xn,

First(X)都包含了First(X1)-{ε}。

若对于某个i<n,所有的First(X1)......First(Xi)都包含了ε,则First(X)也包含了Fitst(X(i+1))-{ε}.

若所有First(Xi)都包含ε,则First(X)也包含ε,(如果X—>ε,很显然,此时First(X)包含了ε)

3.求任意串的First,这种情况一般是求某个产生式的候选式a的First(a),

先假设a=X1X2....Xn。则First(a)定义为:First(a)包含了First(X1)-{ε},

若对于每个i=2,3,。。。n。有k=1,2,。。。i-1,First(Xk)都包含ε,

则First(a)就包含了First(Xi)-{ε},

最后,如果对于所有的i=1,2,...... First(Xi)都包含ε,则First(a)也包含ε.

(2) Follow定义:

给出一个非终结符(non-terminal)A,那么集合Follow(A)则是由终结符(terminal)组成,此外可能还有$

集合Follow(A)定义如下:

1 若A是开始符号,则$就在Follow(A)中。

2 若存在产生式B->aAy,则First(y)-{ε}在Follow(A)中

3 若存在产生式B->aAy,且ε在First(y)中,则Follow(A)也包含Follow(B)

(3) 预测分析表构造

LL(1) 分析表M[N, T] 的构造:为每个非终结符A和产生式A→a 重复以下两个步骤:

1) 对于First (a)中的每个记号a,都将A→a添加到项目M [A, a]中.

2) 若在First (a)中,则对于Follow (A) 的每个元素a(记号或是$),都将A→a  添加到M[A, a]中。


3. 预测分析法


4. 例子


0 0
原创粉丝点击