LL(1)文法的定义与判别

合集下载

LL(1)文法的判别

LL(1)文法的判别

实验四:LL(1)文法的判别一、实验名称LL(1)文法的判别二、实验目的(1)能导出空串的非终结符算法(2)实现首符集,后跟符集和可选集算法(3)输出要指出是否为LL(1)文法,三、实验原理①将数组X[ ]中对应每一非终结符的标记置初值为"未定"。

②扫描文法中的产生式。

(a) 删除所有右部含有终结符的产生式,若这使得以某一非终结符为左部的所有产生式都被删除,则将数组中对应该非终结符的标记值改为"否",说明该非终结符不能推出ε。

(b) 若某一非终结符的某一产生式右部为ε,则将数组中对应该非终结符的标志置为"是",并从文法中删除该非终结符的所有产生式。

例中对应非终结符A、B的标志改为"是"。

③扫描产生式右部的每一符号。

(a) 若所扫描到的非终结符号在数组中对应的标志是"是",则删去该非终结符,若这使产生式右部为空,则对产生式左部的非终结符在数组中对应的标志改"是",并删除该非终结符为左部的所有产生式。

(b) 若所扫描到的非终结符号在数组中对应的标志是"否",则删去该产生式,若这使产生式左部非终结符的有关产生式都被删去,则把在数组中该非终结符对应的标志改成"否"。

④重复③,直到扫描完一遍文法的产生式,数组中非终结符对应的特征再没有改变为止。

由②中(a) 、(b)得知例中对应非终结符D的标志改为"否",对应非终结符A、B的标志改为"是"。

经过上述②中(a)、(b)两步后文法中的产生式只剩下:S→AB和C→AD ,也就是只剩下右部全是非终结符串的产生式。

再由③中的(a)步扫描到产生式S→AB时,在数组中A、B对应的标志都为"是",删去后S的右部变为空,所以S对应标志置为"是"。

LL(1)文法的定义与判别

LL(1)文法的定义与判别

例4:若有文法G4的产生式为: (1) S→Ap|Bq (2) A→aAp|d (3) B→aBq|e 用(2)、(3)产生式的右部替换(1)中产生式的A、B使文法变为: (1) S→aApp|aBqq (2) S→dp|eq (3) A→aAp|d (4) B→aBq|e 对(1)提取左公共因子则得: S→a(App|Bqq) 再引入新非终符S′结果得等价文法为: (1) S→aS′ (2) S→dp|eq (3) S′→App|Bqq (4) A→aAp|d (5) B→aBq|e 同样分别用(4)、(5)产生式的右部替换(3)中右部的A、B再提取左公共因子最后结果得: (1) S→aS′ (2) S→dp|eq (3) S′→aS″ (4) S′→dpp|eqq (5) S″→Appp|Bqqq (6) A→aAp|d (7) B→aBq|e
SELECT(D→aS)∩SELECT(D→c)={a}∩{c}= 由LL(1)文法定义知该文法不是LL(1)文法,因为关于S和C的相同左部其产生式的SELECT集 的交集不为空。
4.3 非LL(1)文法到LL(1)文法的等价转换
由前面可知:确定的自顶向下分析要求对给定语言的文法必须是LL(1)形式。然而,不一定每个 语言都有LL(1)文法。对一个语言的非LL(1)文法是否能变换为等价的LL(1)形式以及如何变换是本节 讨论的主要问题。
若文法中含有直接或间接左递归,或含有左公共因子则该文法肯定不是LL(1)文法。因而,我们 设法消除文法中的左递归,提取左公共因子对文法进行等价变换,在某些特殊情况下可能使其变为 LL(1)文法。
1. 提取左公共因子
若文法中含有形如:A→αβ|αγ的产生式,这导致了对相同左部的产生式其右部的FIRST集相
解:对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′: S→aSA A→b A→ε S→ε

编译原理实验LL(1)文法的判断及转换

编译原理实验LL(1)文法的判断及转换

2016.11.30LL(1)文法的判断及转换目录一、实验名称 (2)二、实验目的 (2)三、实验原理 (2)1、First集定义 (2)2、Follow集定义 (2)3、Select集定义 (3)4、含左递归文法 (3)四、实验思路 (3)1、求非终结符是否能导出空 (3)2、求First集算法 (3)3、求Follow集算法 (3)4、求Select集算法 (4)五、实验小结 (4)六、附件 (4)1、源代码 (4)2、运行结果截图 (10)一、实验名称LL(1)文法的判断及转换二、实验目的输入:任意一个文法输出:(1)是否为LL(1)文法(2)若是,给出每条产生式的select集(3)若不是,看看是否含有左公共因子或者含有左递归,并用相应的方法将非LL(1)文法变成LL(1)文法,并输出新文法中每条产生式的select集。

三、实验原理1、First集定义令X为一个文法符号(终止符或非终止符)或ε,则集合First(X)有终止符组成,此外可能还有ε,它的定义如下:1.若X是终止符或ε,则First(X)={X}。

2.若X是非终结符,则对于每个产生式X—>X1X2…Xn,First(X)包含了First (X1)-{ε}。

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

若所有集合First(X1),...,First (Xn)都包括了ε,则First(X)也包括了ε。

2、Follow集定义给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还含有#(#是题目约定的字符串结束符)。

集合Follow(A)的定义如下:1. 若A是开始符号,则#在Follow(A)中。

2. 若存在产生式B—>αAγ,则First(γ)- {ε}在Follow(A)中。

3. 若存在产生式B—>αAγ,且ε在First(γ)中,则Follow(A)包括Follow (B)。

LL(1)文法分析.

LL(1)文法分析.

构造预测分析表
在确定的自顶向下分析方法中,又有递归子程序法和预测分 析方法,我们采用的是预测分析的方法。一个预测分析器 由三部分组成: (1)预测分析程序 (2)先进后出栈 (3)预测分析表 其中,只有预测分析表与文法有关。分析表可用矩阵M 表示。M(A,a)中的下标A表示非终结符,a为终结符 或括号,矩阵元素M(A,a)中的内容是一条关于A的产 生式,表明当用非终结符A往下推导时,面临输入符A时, 所应采取的候选产生式,元素内容无产生式时,则表明出 错。为便于辨认,我们令M数组为 Analyze数组。
算法介绍
1、在对输入序列进行LL(1)文法分析之前,首先要对文法进行判 别,看文法是不是LL(1)文法。这个文法应该满足无二义性,无 左递归,无公因子。具体的判别过程是,求出能推出ε的非终结 符,求出FIRST集,求出FOLLOW集,求出SELLECT集,看相 同左部的产生式的SELLECT集是否有交集,有就不是LL(1)文 法。 2、如果输入文法不是LL(1)文法,可以进行转换,转换一般有两 种方法:提取左公因子法和消除左递归法。 3、构造预测分析表,设二维矩阵M。
4、预测分析。
人员分工
• 负责MFC界面制作,程序总控,各个非终结 符能否推出ε的计算,判断是否LL(1),以及人员 分工。 • 消除左递归的实现 • 提取公因子的实现 • 求FIRST集 • 求FOLLOW集 • 求SELLECT集 • 构造预测分析表,分析输入的句子
程序流程
程序开始 InitAndConvertPt(); //读入文法、消除左递归、提取公因子 InitArray(); //初始化N[ ]数组 VnRefresh(Pt); //构造非终结符集 VtRefresh(Pt);//构造终结符集 Create_N_Table(); //判断哪些非终结符可以推出空,存入N[ ]

如何判断一个文法是LL(1)文法

如何判断一个文法是LL(1)文法
4.2.3 LL(1)文法的判别
要构造确定的自顶向下分析程序要求描述文法必 须是LL(1)文法
LL的含义 -自左向右扫描分析输入符号串 -从识别符号开始生成句子的最左推导 LL(1):向前看一个输入符号,便能唯一确定当前应选择的规则 LL(k):向前看k个输入符号,才能唯一确定当前应选择的规则
编译原理
(2到)F若IRαS=T(Xαα)中′,;X∈VN,且有产生式X→b…,则把b加入
例: FIRST(FT')={(,i} ??
编译原理
2020年1月27日
4
(3)若α=X1X2 … Xnα′,其中Xi∈VN , 1≤i≤n; 例:FIRST(FT')= FIRST(F)-{ε}={(,i}
E→TE' E'→+TE'| T→FT' T'→*FT'| F→(E)|i
FIRST()={a| a …,a∈VT 若 ,则规定∈FIRST()
FIRST(α):从α可能推导出的所有开头终结符号或ε
【例】 S→aAb A→cd|c
FIRST(aAb) ={a} FIRST(cd) ={c} FIRST(c) ={c}
【例】
S→Aa A→a|
FIRST(a) ={a} FIRST() = {} FIRST(Aa) ={a}
9
3.LL(1)文法的判别条件 若一个文法满足以下条件,则称该文法G为LL(1)文法:
(1)文法不含左递归;
(2)对于每个非终结符A的各个候选式的终结首符号 集两两不相交。即,如果A→α 1|α 2|…|α n,则 FIRST(αi)∩FIRST(αj)= Φ,其中1≤i,j≤n,且i≠j。
(3)对于文法中每个非终结符A,若它某个候选式的终 结首符号集包含ε,则 FIRST(A)∩FOLLOW(A)=Φ

LL(1)文法判别过程总结

LL(1)文法判别过程总结

LL(1)文法的判别:五步判别法1.求能推出ε的非终结符集:列表判断每个非终结符能否推出ε2.计算每个产生式右部α的FIRST(α)集(1)计算V中每个符号的FIRST(X)1.对形如X->ε的产生式,把ε收入到First(X)中2.对形如X->a…的产生式,把a收入到First(X)中3.右部不全能推出空:对形如X->Y1Y2…Y i-1Y i…的产生式(其中Y1Y2…Y i-1均推出空,而Y i不能推出空),则First(X) = First(Y1)-{ε} ∪ First(Y2)-{ε} ∪First(Y i-1)-{ε} ∪ First(Y i)4.右部全能推出空:对形如X->Y1Y2..Y n的产生式(其中Y i均推出空),则First(X)= First(Y1) ∪ First(Y2)∪ First(Y n)∪{ε}(2)利用每个非终结符的FIRST集计算规则右部符号串的FIRST集1.右部α = ε, FIRST(α)= ε2.右部α =ABCD1)右部α的第一个符号不能推出空, FIRST(α) = FIRST(A)2)右部不全能推出空,例如ABC能推出空,D不能,则FIRST(α)=FIRST(A)-{ε} ∪ FIRST(B)-{ε} ∪ FIRST(C)-{ε} ∪ FIRST(D)3)右部全能推出空,例如ABCD都能推出空,则FIRST(α)=FIRST(A) ∪FIRST(B) ∪ FIRST(C) ∪ FIRST(D) ∪ {ε}3.计算每个非终结符P的FOLLOW(P)集(1)如果P是开始符号,将#放入follow(P)(2)否则,在每条产生式右部找P1)P在最后,对形如U->…P的产生式,则Follow(P)=Follow(U)。

2)P不在最后,但后面都推空:对形如U->…PABC的产生式(其中ABC都推出空),则Follow(P) = Follow(U)∪first(A) - {ε} ∪ first(B) -{ε} ∪ first(C)- {ε}3)P不在最后,但后面不全推出空,取后面的First集合的非空元素并入Follow(P)4.计算每个产生式A→α的SELECT(A→α)集按定义计算SELECT(A→α):•若αε,则SELECT(A→α)=FIRST(α)•若αε,则SELECT(A→α)=(FIRST(α)-{ε})∪FOLLOW(A)5.根据LL(1)文法定义进行判断。

05-LL(1)文法及其分析程序

编译原理
要内容
本章学习目标 5.1 LL(1)文法 • FIRST和FOLLOW集定义和计算 • LL(1)文法定义 • LL(1)分析程序的生成 5.2 自顶向下的分析方法 5.3 非LL(1)文法的改造 小结本章 重点习题解析 思考&练习 相关术语的回顾(英文版)
2
20
举例 P94
G[ E]: (1) E –> TE’ (4) T –> FT’ (7) F –> (E) (2) E’ –> +TE’ (3) E’ –> (5) T’ –> *FT’ (6) T’ –> (8) F –> a 各非终结符的FOLLOW集合为: FOLLOW(E)={),#} FOLLOW(E′)={),#} FOLLOW(T)={+,),#} FOLLOW(T′)={+,),#} FOLLOW(F)={*,+,),#}
Select(E’ –> +TE’)={+}
{),#} Select(T’ –> *FT’) ={*} Select(T’ –> )={+,),#} Select(F –> (E) )={(} Select(F –> a)={a} Select(E –> TE’)={(,a} Select(T –>FT’) ={(,a} 由上可知,相同左部产生式的Select集合交集为空, 所以G[E]是LL(1)文法。
12
LL (1)文法的相关定义
FIRST集和FOLLOW集的定义 设G=(VT,VN,P,S)是上下文无关文法 * FIRST()={a| =>* a,a∈VT, , ∈V } 若 =>* ε 则规定ε ∈FRIST() FOLLOW(A)={aS =>* A 且a ∈ FRIST(), * ∈V , ∈V+ } 若S =>* u A ,且 =>* ε ,则 #∈FOLLOW(A)

ll1文法的判定条件

ll1文法的判定条件
LL(1)文法是一种上下文无关文法,用于描述一类非常有限的语言结构。

LL(1)文法有以下几个判定条件:
1. 无左递归:LL(1)文法不能包含直接左递归。

直接左递归是指产生式右部的第一个符号是产生式的左部非终结符本身。

2. 消除间接左递归:如果存在间接左递归,即产生式右部可以通过一系列的推导最终回到产生式左部的情况,需要将间接左递归转化为直接左递归,使得文法不包含间接左递归。

3. 消除左公因子:在LL(1)文法中,产生式右部的第一个符号不能相同。

如果存在左公因子,即产生式右部的某个前缀相同,需要对左公因子进行提取,得到新的产生式。

4. First集不相交:对于文法中每个非终结符A,其First集合与其他非终结符的First集合应该互斥,即不相交。

First集合是从一个非终结符开始的所有可能的终结符的集合。

5. Follow集不相交:同样,对于文法中的每个非终结符A,其Follow集合与其他非终结符的Follow集合应该互斥,即不相交。

Follow集合是在一个推导过程中,紧跟在非终结符后面的所有可能的终结符的集合。

通过满足以上五个条件,我们可以确定一个文法是否为LL(1)文法。

LL(1)文法具有预测性,即在每个输入符号位置,根据当前的输入符号和推导栈中的符号,就可以确定接下来使用哪个产生式进行推导。

这种特性使得LL(1)文法适用于递归下降分析法和预测分析表的构建。

LL(1)文法的判定条件包括无左递归、消除间接左递归、消除左公因子、First集不相交和Follow集不相交。

满足这些条件的文法可以被用于构建预测分析表,实现语法分析。

ll1文法判别条件

ll1文法判别条件LL(1)文法是一种用于描述上下文无关文法(CFG)的形式化表示方法。

它具有一些特定的判别条件,以便能够被编译器有效地解析。

首先,一个上下文无关文法被认为是LL(1)文法,需要满足文法的产生式具有以下两个属性:1. 产生式左部不含有相同的非终结符。

即,对于任意的两个产生式A->α和B->β,其中A和B是非终结符,α和β是文法中的串,如果A=B,则α必须等于β。

2. 当两个产生式的左部相同时,它们的右部能够根据输入符号的“向前看”符号(lookahead symbols)进行唯一选择。

这意味着,对于任意的两个产生式A->α和A->β,其中A是非终结符,α和β是文法中的串,如果存在一个输入符号a,使得在A的上下文中,α可以被选择,而β不能被选择,那么α和β不能有任何一个前缀串是相同的。

除了上述产生式的属性外,LL(1)文法还需要满足以下两个条件:1. 对于文法中的每个非终结符A,使用它的所有产生式的右部的First集合中的符号,这些符号不应该有重叠。

First(α)表示产生式α的第一个(最左端)终结符集合。

2. 如果一个产生式右部能够推导为空串(ε),那么该产生式右部的Follow集合和非终结符A的Follow集合应该没有交集。

Follow(A)表示在整个文法中,紧随非终结符A右边的符号的集合。

通过满足以上条件,我们可以判断一个上下文无关文法是否是LL(1)文法。

若满足条件,则可以使用预测分析表来解析此文法,有效地构建编译器。

总结起来,LL(1)文法的判别条件包括产生式左部不含有相同的非终结符、根据“向前看”符号唯一选择产生式右部、非终结符的产生式右部的First集合无重叠、产生式右部能够推导为空串时,Follow集合和非终结符的Follow集合无交集。

只有满足这些条件的文法才能被称为LL(1)文法,并应用于编译器的解析过程中。

编译判定LL(1)文法

云南大学2010-2011学年下学期软件学院软件工程专业2008级《编译技术》实验报告实验二:判定LL(1)文法任课教师:***学生姓名:***学生学号:***********实验成绩:提交日期:1、实验目标实现判定LL(1)文法的分析器2、实现方案L(1)文法使用的是确定的自顶向下的分析技术。

LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。

LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判断是否为LL(1)文法,最后再进行句子分析。

语言的词法规则在本示例程序中,单个字符(字母、数字、符号甚至是汉字)可以规定为终结符或非终结符,但是"$"和"#"符号作为空串处理不可以作为终结符或非终结符去处理。

语言的语法规则(1)产生式的右部不全是有终结符组成(2)如果两个产生式有相同的左部,他们的右部是由不同的终结符或非终结符开始3、实现步骤能推出$的非终结符,FIRST集的确定,FOLLOW集的确定,SELLECT集的确定,LL(1)文法的判定,句子的判定4、结构算法能推出$的非终结符首先进行第一次扫描,把能够直接推出$的非终结符号记录到空串表,把不能直接推出$的符号依次记录下来,然后单个扫描每一个不能直接推出$的符号。

扫描这个符号能够直接推出的第一个非终结符记录到一个队列,接下来依次检查队列中每一个元素,把二次能够推出$的符号记录到空串表,把二次也推不出空串的继续送入到队列,然后再从队列取元素扫描,直到队列为空没能找到能够星推导出$的终结符,那么可以确定这个非终结符推导不出$。

接下去扫描下一个非终结符。

FIRST集的确定FIRST集使用以下四个步骤判定:(1)若X∈VT ,则FIRST(X)={X}(2)若X∈VN,且有产生式X→a…,a∈VT则把a加入到FIRST(X)中,即a∈FIRST(X)(3)若X∈VN,且有产生式X→$,则把$也加到FIRST(X)中,即$∈FIRST(X)(4)若X∈VN, Y1,Y2,…,Yi 都∈VN,且有产生式X→Y1Y2…Yn。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S→AB
S→bC
A→ε
A→b B→ε B→aD C→AD C→b D→aS D→c 解:
FIRST(S)={b,a,ε} FIRST(A)={b,ε} FIRST(B)={a,ε} FIRST(C)={a,b,c} FIRST(D)={a,c}
4.计算FOLLOW集
对文法中每一 A∈VN 计算 FOLLOW(A): (a)设S为文法中开始符号,把{#}加入FOLLOW(S)中(这里“#”为句子括号)。
(1) A→ad (2) A→aAc





单自 元顶 目向 录下



(3) A→bBc (4) B→aA (5) B→bB 提取产生式(1)、(2)的左公共因子得: A→a(d|Ac) A→bBc B→aA B→bB 引进新非终结符A′,去掉'(',')'后得G′为: (1) A→aA′ (2) A→bBc (3) A′→d (4) A′→Ac (5) B→aA (6) B→bB 不难验证经提取左公共因子后文法例1中的G′仍不是LL(1)文法。而文法例2中的G′变成LL(1) 文法,因此文法中不含左公共因子只是LL(1)文法的必要条件。 值得注意的是对文法进行提取左公共因子变换后,有时会使某些产生式变成无用产生式,在这 种情况下必须对文法重新压缩(或化简)。 例3:若有文法G的产生式为: (1) S→aSd (2) S→Ac (3) A→aS (4) A→b 用产生式(3)、(4)中右部替换产生式(2)中右部的A,文法变为: (1) S→aSd (2) S→aSc (3) S→bc (4) A→aS (5) A→b 对(1)、(2)提取左公共因子得: S→aS(d|c) 引入新非终结符A′后变为: (1) S→aSA′ (2) S→bc (3) A′→d|c (4) A→aS (5) A→b 显然,原文法G3中非终结符A变成不可到达的符号,产生式(4)、(5)也就变为无用产生式,所以 应删除。 此外也存在某些文法不能在有限步骤内提取完左公共因子。
select (A→bAS)∩ select(A → ε)= 所以,该文法是LL(1)文法。 例2:判断下列文法是否是LL(1)文法 文法G [S]为: S→aAS S→b A→bA A→ε 解: SELECT(S→aAS)={a} SELECT(S→b)={b} SELECT(A→bA)={b} SELECT(A→ε)={a,b}
5、当(4)中所有Yi ε,(i=1,2,…n),则FIRST(X)=(FIRST(Y1)-{ε} ) ∪(FIRST(Y2)- {ε} ) ∪…∪(FIRST(Yn) -{ε} ) ∪{ε}
反复使用上述(2)~(5)步直到每个符号的FIRST集合不再增大为止。 例 3 :文法G[S]为:
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c 求每个终结符的First集。 解:FIRST(S)={FIRST(A)-{ε}}∪{FIRST(B)-{ε}}∪{ε}∪{b}={b,a,ε} FIRST(A)={b}∪{ε}={ b,ε} FIRST(B)={ε}∪{a}={a,ε} FIRST(C)={FIRST(A)-{ε}}∪FIRST(D)∪FIRST(b)={b,a,c} FIRST(D)={a}∪{c}={a,c} 也可以由关系图法求文法符号的FIRST集,可作为一种验证。其方法为: (a)每个文法符号对应图中一个结点,对应终结符的结点时用符号本身标记,对应非终结符 的结点用FIRST(A)标记。这里A表示非终结符。
(b)若A→αBβ是一个产生式,则把FIRST(β)的非空元素加入FOLLOW(B)中。如果β FOLLOW(A)也加入FOLLOW(B)中。
(c)反复使用(b)直到每个非终结符的FOLLOW集不再增大为止。 例5:文法G[S]为:
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c 求每个非终结符的Follow集。
所以SELECT(S→aAS)∩SELECT(S→b)={a}∩{b}=
SELECT(A→bA)∩SELECT(A→ε)={b}∩{a,b}≠ 因此,该文法不是LL(1)文法,因而也就不可能用确定的自顶向下分析。
3. LL(1)文法的判别
当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而我们对任给
SELECT(S→AB)∩SELECT(S→bC)={b,a,#}∩{b}={b}≠
SELECT(A→ε)∩SELECT(A→b)={a,c,#}∩{b}=
SELECT(B→ε)∩SELECT(B→aD)={#}∩{a}=
SELECT(C→AD)∩SELECT(C→b)={b,a,c}∩{b}={b}≠
解:对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′: S→aSA A→b A→ε S→ε
例2:若文法G的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB 请提取文法中的隐式左公因子。
解:产生式(2)的右部以非终结符开始,因此左公共因子可能是隐式的,所以这种情况下对右部 以非终结符开始的产生式,用其相同左部而右部以终结符开始的产生式进行相应替换,对文法G2分 别用(3)、(4)的右部替换(2)中的B,可得:
若文法中含有直接或间接左递归,或含有左公共因子则该文法肯定不是LL(1)文法。因而,我们 设法消除文法中的左递归,提取左公共因子对文法进行等价变换,在某些特殊情况下可能使其变为 LL(1)文法。
1. 提取左公共因子
若文法中含有形如:A→αβ|αγ的产生式,这导致了对相同左部的产生式其右部的FIRST集相
弧。
ቤተ መጻሕፍቲ ባይዱ
(b)如果文法中有产生式A→αXβ,且α
ε,则从对应A的结点到对应X的结点连一条箭
员。
(c) 凡是从FIRST(A)结点有路径可到达的终结符结点所标记的终结符都为FIRST(A)的成
(d) 由ε是否为某非终结符FIRST集的成员,若是则将ε加入该非终结符的FIRST集中。
例4:文法G [S]为:
非终结符A′,变为:A→αA′,A′→β1|β2|…|βn。若在βi、βj、βk … (其中1≤i,j, k≤n)中仍含有左公共因子,这时可再次提取,这样反复进行提取直到引进新非终结符的有关产生式 再无左公共因子为止。
例1:若文法G的产生式为: (1) S→aSb (2) S→aS (3) S→ε 请提取文法中的左公因子
3.若X Y...是一个产生式且Y VN,则把FORST(Y)中的所有非 元素都加到FIRST(X)中.
4、若X∈VN;Y1,Y2,…,Yi∈VN,且有产生式X→Y1 Y2 … Yn;当Y1,Y2,…,Yi-1都 ε 时,(其中1≤i≤n),则FIRST(Y1)、FIRST(Y2)、…、FIRST(Yi-1)的所有非空元素和FIRST(Yi)都包 含在FIRST(X)中。





单自 元顶 目向 录下



文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否为LL(1)文法。
计算FIRST集
1.若X VT,则FIRST(X)={X}.
2.若X VN,且有产生式X a...,a VT,则把a加入到FIRST(X)中;若X 到FIRST(X)中.
是一条产生式,则把 也加
4.2 LL(1)文法的定义和判别
1. 定义4.4
一个上下文无关文法是LL(1)文法的充分必要条件是:对每个非终结符A的两个不同产生式,
A→α, A→β,满足SELECT(A→α)∩SELECT(A→β)=
2. LL(1)文法的含义:
。其中α,β不同时能 ε。
第一个L 从左到右扫描输入串
第二个L 生成的是最左推导
例4:若有文法G4的产生式为: (1) S→Ap|Bq (2) A→aAp|d (3) B→aBq|e 用(2)、(3)产生式的右部替换(1)中产生式的A、B使文法变为: (1) S→aApp|aBqq (2) S→dp|eq (3) A→aAp|d (4) B→aBq|e 对(1)提取左公共因子则得: S→a(App|Bqq) 再引入新非终符S′结果得等价文法为: (1) S→aS′ (2) S→dp|eq (3) S′→App|Bqq (4) A→aAp|d (5) B→aBq|e 同样分别用(4)、(5)产生式的右部替换(3)中右部的A、B再提取左公共因子最后结果得: (1) S→aS′ (2) S→dp|eq (3) S′→aS″ (4) S′→dpp|eqq (5) S″→Appp|Bqqq (6) A→aAp|d (7) B→aBq|e
SELECT(D→aS)∩SELECT(D→c)={a}∩{c}= 由LL(1)文法定义知该文法不是LL(1)文法,因为关于S和C的相同左部其产生式的SELECT集 的交集不为空。
4.3 非LL(1)文法到LL(1)文法的等价转换
由前面可知:确定的自顶向下分析要求对给定语言的文法必须是LL(1)形式。然而,不一定每个 语言都有LL(1)文法。对一个语言的非LL(1)文法是否能变换为等价的LL(1)形式以及如何变换是本节 讨论的主要问题。
改写后的文法不含空产生式,且无左递归时,则改写后的文法是LL(1)文法,否则还需用LL(1)文法 的判别方式进行判断才能确定是否为LL(1)文法。
2. 消除左递归:
交,也就是SELECT(A→αβ)∩SELECT(A→αγ) ≠ ,不满足LL(1)文法的充分必要条件。 现将产生式A→αβ|αγ进行等价变换为:A→α(β|γ),使产生式变换为:A→αA′,A
′→β|γ。 写成一般形式为: A→αβ1|αβ2|…|αβn,提取左公共因子后变为:A→α(β1|β2|…|βn),再引进
相关文档
最新文档