语法分析-自上而下分析

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

第四章语法分析—自上而下分析

知识结构:

带回溯分析法

回溯

自上而下分析面临的问题

左递归

问题的解决

语法分析-求FIRST、FOLLOW集合的算法自上而下分析LL(1)分析法证明LL(1)文法

构造LL(1)分析表

递归子程序的构造思想

递归子程序法递归子程序的特点

递归子程序的设计

第一节语法分析综述

一、语法分析的任务

按照语言即定的语法规则,对字符串形式的源程序进行语法检查,并识别出相应的语法成分。即语法结构是否符合语法规则。

二、语法分析器在编译程序中的地位(一遍扫描)

三、语法分析方法

通常把语法分析方法分为两大类,既自上而下分析与自下而上分析。

1、自上而下分析方法

实际上是一种产生的方法,分析过程是一个推导过程。

⑴自上而下分析过程

从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与输入的符号串完全相匹配的句子。采用最左推导,以文法开始符号为根结点,逐步为输入串自上而下地构造一棵语法树。

面临的输入符号为a,A所有的产生式:

A12n

①若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

a A

B a A

* B a A

+

⑵自上而下分析法

自上而下分析法又可分为确定和不确定的两种。

①不确定的分析法(带回溯)

是一种穷举的试探方法,效率低、代价高,极少使用。

②确定的分析法(不带回溯)

实现方法简单、直观,便于手工构造或自动生成语法分析器,是目前常用的方法之一。但是对文法有一定的限制。

2、自下而上分析法

⑴自下而上分析过程

分析过程是归约过程。从给定的输入串W开始,不断寻找与文法G中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。

⑵自下而上分析法

①算符优先分析法

定义算符(广义讲是文法的终结符号)之间的某种优先和结合关系,借助这种关系来寻找并确定可归约字符串,并进行归约。

②LR分析法

是一类自左向右对输入串进行扫描的自下而上分析方法,分析过程是规范归约的序列。适用于语法分析器的自动构造。

第二节自上而下分析面临的问题

一、不确定的自上而下分析方法

是从文法的开始S出发,试图用一切可能的方法向下推导,产生句子,这种分析过程的本质是一种试探推导过程。

例:文法G

⑴S aAd

⑵A ab a

构造W=aad的最左推导:S aAd aad。

构造语法树:

①产生树的根结点,即文法的开始符号。

②选用文法G的文法规则去延伸树。

③判断当前延伸的子结与输入串扫描到的字符是否匹配。

④若不匹配注销掉当前延伸的子树,选用文法规则的另一个产生式延伸分析树。

⑤直到输入串与语法树末端结点相匹配,分析结束。

S S S

a A d a A d a A d

a b

这种试探识别句子的过程,只会使分析的过程不确定。

二、不确定性的原因

由于分析过程中选择的侯选式不确定,造成输入串匹配的假象,甚至会导致算法实现的失败。

1、左递归问题

由于采用最左推导,左递归将使得输入串的分析过程陷入无限循环之中。

2、回溯问题

⑴采用试探的方法,如匹配不成功回溯到前面分析的某一步。

⑵可能出现假匹配,造成对输入串识别的失败。

⑶不能准确报告输入串的出错位置。

三、确定的自上而下分析方法

1、确定的自上而下分析方法的必要条件

⑴消除文法中的左递归;

⑵消除文法中的回溯问题。

2、消除文法的左递归

文法的左递归可以通过对文法产生式进行改写,使之不含有左递归的非终结符号。左递归一般有两种情况,直接左递归和间接左递归。

⑴直接左递归

如果文法中任意一个非终结符P,若P P(V N U V T),并且在最左推导中有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→P1P2…… P m12……n i≠ε

改写为:

P→1P2P………n P

P→1P2P………m P

③消除间接左递归

A→B…

B→C…间接左递归: A B…C…A…

C→A…

例:文法G

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删除。

相关文档
最新文档