语法分析-自上而下分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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删除。