语法分析自上而下分析Word下载.docx

上传人:b****1 文档编号:14260676 上传时间:2022-10-21 格式:DOCX 页数:34 大小:93.01KB
下载 相关 举报
语法分析自上而下分析Word下载.docx_第1页
第1页 / 共34页
语法分析自上而下分析Word下载.docx_第2页
第2页 / 共34页
语法分析自上而下分析Word下载.docx_第3页
第3页 / 共34页
语法分析自上而下分析Word下载.docx_第4页
第4页 / 共34页
语法分析自上而下分析Word下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

语法分析自上而下分析Word下载.docx

《语法分析自上而下分析Word下载.docx》由会员分享,可在线阅读,更多相关《语法分析自上而下分析Word下载.docx(34页珍藏版)》请在冰豆网上搜索。

语法分析自上而下分析Word下载.docx

从文法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)=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1