语法分析自上而下分析Word下载.docx
《语法分析自上而下分析Word下载.docx》由会员分享,可在线阅读,更多相关《语法分析自上而下分析Word下载.docx(34页珍藏版)》请在冰豆网上搜索。
从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与输入的符号串完全相匹配的句子。
采用最左推导,以文法开始符号为根结点,逐步为输入串自上而下地构造一棵语法树。
面临的输入符号为a,A所有的产生式:
A→α1|α2|⋯|αn
若a∈FISRT(αi),则指派去执行匹配任务。
若a不属于任何一个候选首字符集,则:
a、若ε属于某个FISRT(αi)且a∈FOLLOW(A),则让A与ε自动匹配;
b、否则,a的出现是一种错误。
例:
设有文法G和输入符号串W:
a*a+a
G:
S→aA∣a
A→BaA∣ε
B→+∣-∣*∣/
推导过程:
S⇒aA⇒aBaA⇒a*aA⇒a*aBaA⇒a*a+aA⇒a*a+a=W
构造语法树:
S
aA
BaA
*BaA
+ε
自上而下分析法
自上而下分析法又可分为确定和不确定的两种。
不确定的分析法(带回溯)
是一种穷举的试探方法,效率低、代价高,极少使用。
确定的分析法(不带回溯)
实现方法简单、直观,便于手工构造或自动生成语法分析器,是目前常用的方法之一。
但是对文法有一定的限制。
2、自下而上分析法
自下而上分析过程
分析过程是归约过程。
从给定的输入串W开始,不断寻找与文法G中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。
自下而上分析法
算符优先分析法
定义算符(广义讲是文法的终结符号)之间的某种优先和结合关系,借助这种关系来寻找并确定可归约字符串,并进行归约。
LR分析法
是一类自左向右对输入串进行扫描的自下而上分析方法,分析过程是规范归约的序列。
适用于语法分析器的自动构造。
第二节自上而下分析面临的问题
一、不确定的自上而下分析方法
是从文法的开始S出发,试图用一切可能的方法向下推导,产生句子,这种分析过程的本质是一种试探推导过程。
文法G
S→aAd
A→ab∣a
构造W=aad的最左推导:
S⇒aAd⇒aad。
构造语法树:
产生树的根结点,即文法的开始符号。
选用文法G的文法规则去延伸树。
判断当前延伸的子结与输入串扫描到的字符是否匹配。
若不匹配注销掉当前延伸的子树,选用文法规则的另一个产生式延伸分析树。
直到输入串与语法树末端结点相匹配,分析结束。
SSS
aAdaAdaAd
aba
这种试探识别句子的过程,只会使分析的过程不确定。
二、不确定性的原因
由于分析过程中选择的侯选式不确定,造成输入串匹配的假象,甚至会导致算法实现的失败。
1、左递归问题
由于采用最左推导,左递归将使得输入串的分析过程陷入无限循环之中。
2、回溯问题
采用试探的方法,如匹配不成功回溯到前面分析的某一步。
可能出现假匹配,造成对输入串识别的失败。
不能准确报告输入串的出错位置。
三、确定的自上而下分析方法
1、确定的自上而下分析方法的必要条件
消除文法中的左递归;
消除文法中的回溯问题。
2、消除文法的左递归
文法的左递归可以通过对文法产生式进行改写,使之不含有左递归的非终结符号。
左递归一般有两种情况,直接左递归和间接左递归。
直接左递归
如果文法中任意一个非终结符P,若P→Pα(α∈VNUVT),并且在最左推导中有P⇒P⋯形式,称为直接左递归。
间接左递归
在最左推导中有P
P⋯形式,称为间接左递归。
消除直接左递归
P→Pα|β
改写为:
P→βP'
P'
→αP'
∣ε
表达式文法
E→E+T∣T
E→TE'
E'
→+TE'
∣ε
T→T*F∣F
T→FT'
T'
→*FT'
F→(E)∣i
消除文法的左递归一般规则
P→Pα1∣Pα2∣……Pαm∣β1∣β2∣……∣βnαi≠ε
P→β1P'
∣β2P'
∣………βnP'
P→α1P'
∣α2P'
∣………αmP'
∣ε
消除间接左递归
A→B…
B→C…间接左递归:
A⇒B…⇒C…⇒A…
C→A…
S→Qc|c
Q→Rb|b
R→Sa|a
最左推导:
S⇒Qc⇒Rbc⇒Sabc(间接左递归)
清除间接左递归
非终结符排序为R,Q,S。
R不存在直接左递归,把R代入Q的规则:
Q→Sab|ab|b
再把Q代入S:
S→Sabc|abc|bc|c
消除S的左递归:
S→abcS'
|bcS'
|cS'
S'
→abcS'
|ε
Q和R的产生式不再被引用,将Q和R删除。
非终结符排序为S,Q,R。
S不存在直接左递归,Q的产生式不包含S,再把S代入得到R:
R→Rbca|bca|ca|a
R→bcaR'
|caR'
|aR'
R'
→bcaR'
|ε
S→Qc|c不能删除
Q→Rb|b不能删除
R→bcaR'
|caR'
|aR'
|ε
3、消除回溯,提取左因子
消除回朔
文法G不包含左递归,则G中非终结符号的每个候选式首字符集FIRST(α)为:
FIRST(α)={a∣α
a…,a∈VT,α∈(VNUVT)*}若α
ε,则ε∈FIRST(α)。
提取最左公共因子
采用提取最左公共因子的方法改写文法,使得所有侯选式的首字符集两两不相交。
A→αβ1∣αβ2∣……∣αβn∣γ1∣γ2∣……∣γm
提取公因子:
A→α(β1∣β2∣……∣βn)∣γ1∣γ2∣……∣γm
改写后为:
A→αA'
∣γ1∣γ2∣……∣γm
A'
→β1∣β2∣……∣βn
4、确定的自上而下分析方法
预测分析法(LL
(1)分析法)。
递归子程序法。
第三节预测分析法(LL
(1)分析法)
一、LL
(1)分析方法
1、是按自左(第一个“L”)向右的顺序扫描输入字符串;
2、在分析过程中产生句子的最左(第二个“L”)推导;
3、“1”表示在分析过程中,每一步推导,最多只能向前查
看(向右扫描)一个字符。
二、LL(K)分析方法
如果分析过程的每一步推导,要向前查看K个输入字符,则称为LL(K)分析法。
三、LL
(1)文法的定义
该文法是上下文无关的一个子集,是自上而下分析技术的一类文法。
四、LL
(1)分析法的必要条件
1、文法中的非终结符号不包含左递归;
2、对于文法中的每一个非终结符A的各个产生式的侯选首字符集两两不相交。
对于产生式A→α∣β:
若β≠ε,证明侯选式α,β的首字符集是否相交。
FIRST(α)∩FIRST(β)=Ф
若β=ε,证明FIRST(A)和FOLLOW(A)是否相交。
FIRST(A)∩FOLLOW(A)=φ
五、构造FIRST集合的算法
对每一文法符号X∈(VNUVT)*
1、若X∈VT,则FIRST(X)={X}。
2、若X∈VN,且有产生式X→a⋯,a∈VT,则a∈FIRST(X)。
3、若X∈VN,X→ε,则ε∈FIRST(X)
4、若X∈VN,且Y1,Y2,⋯,Yi∈VN,
而有产生式X→Y1,⋯,Yn。
当Y1,Y2,⋯,Yi-1都
ε时,(其中1≤i≤n),则FIRST(Y1,)-{ε},⋯,FIRST(Yi-1)-{ε},
FIRST(Yi)都包含在FIRST(X)中。
若FIRST(Yj)包含ε把ε加到FIRST(X)中。
例文法G
E→TE`
E`→+TE`|ε
T→FT`
T`→*FT`|ε
F→(E)|i
FIRST(E)=FIRST(T)=FIRST(F)={(,i)}
FIRST(E'
)={+,ε}
FIRST(T'
)={*,ε}
六、构造FOLLOW集合的算法
FOLLOW(A)={a|S
….Aa….,a∈VT}
若S
…A,则#∈FOLLOW(A)
FOLLOW(A)为所有句型中紧跟在非终结符A后面的所有终结符集合。
构造算法:
1、对文法开始符号S,将“#”置于FOLLOW(S)中。
即FOLLOW(S)={#}。
2、若A→αBβ是一个产生式,则把FIRST(β)-{ε}加至
FOLLOW(B)中。
3、若A→αB是一个产生式,或A→αBβ是一个产生式,而
β⇒ε(即ε∈FIRST(β));
则把FOLLOW(A)加至FOLLOW(B)中。
例文法G
求FOLLOW(E):
因为F→(E),所以FIRST())加入FOLLOW(E)中,
FOLLOW(E)={)};
又因为E→TE`,E是文法的开始符号,则#加至FOLLOW(E)中,所以
FOLLOW(E)={#}UFOLLOW(E)={#,)}。
求FOLLOW(E`):
因为E→TE`,满足算法(3)若A→αB是一个产生式,则
把FOLLOW(A)加至FOLLOW(B)中,所以
FOLLOW(E`)=FOLLOW(E)UFOLLOW(E)
={#,)}
求FOLLOW(T):
因为E→TE`,满足算法
若A→αBβ是一个产生式,则把
FIRST(β)\{ε}加至FOLLOW(B)中,所以
FOLLOW(T)=FOLLOW(T)UFIRST(E`)\{ε}
={+}
又因为E`⇒ε,满足算法(3)若A→αBβ是一个产生式,而
β⇒ε,则把FOLLOW(A)加至FOLLOW(B)中。
所以
FOLLOW(T)=FOLLOW(E)UFOLLOW(T)
={#,)}U{+}
={#,),+}
求FOLLOW(T`):
因为T→FT`,满足算法(3)若A→αB是一个产生式,则
FOLLOW(T)=FOLLOW(T)UFOLLOW(T`)
求FOLLOW(F):
因为T→FT`,满足算法
FOLLOW(F)=