第四章语法分析-自上而下分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,且Y ,Y ,,Y 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 E →TE` E`→+TE`|ε T →FT` T`→*FT`|ε F→(E)|i
1 2n i i
①若aFISRT( ),则指派去执行匹配任务。 ②若a不属于任何一个候选首字符集,则: a、若 属于某个FISRT( )且aFOLLOW(A),则让A与自动匹配; b、否则,a的出现是一种错误。 例:设有文法G和输入符号串W:a*a+a G:S aAa A BaA B + -*/ 推导过程: SaAaBaAa*aAa*aBaAa*a+aAa*a+a=W 构造语法树: S a A B a A * B a A + ⑵自上而下分析法 自上而下分析法又可分为确定和不确定的两种。 ①不确定的分析法(带回溯) 是一种穷举的试探方法,效率低、代价高,极少使用。 ②确定的分析法(不带回溯) 实现方法简单、直观,便于手工构造或自动生成语法分析器,是 目前常用的方法之一。但是对文法有一定的限制。 2、自下而上分析法 ⑴自下而上分析过程 分析过程是归约过程。从给定的输入串W开始,不断寻找与文法G 中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。 ⑵自下而上分析法 ①算符优先分析法
பைடு நூலகம்
n
N T * T,则aFIRST(X)。
T
,则 FIRST(X)={X}。 ,且有产生式Xa,aV
N
1 2 i VN , 而有产生式X Y1 ,,Yn 。当Y1 ,Y2 ,,Yi-1 都 时,(其中 1≤i≤n),则FIRST(Y1 ,)-{},,FIRST(Yi-1 )-{}, FIRST(Yi )都包含在FIRST(X)中。若FIRST(Yj )包含把加到
N T *
提取公因子: A→(12 …… n) 改写后为: A→A 12 …… m
12
……
m
A→12 …… 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(V UV ) 1、若XV 2、若XV
源程序 语法分析器 词法分析器 语义分析 中间代码生成 取下一个单词 符号表 单词符号 分析树
三、语法分析方法 通常把语法分析方法分为两大类,既自上而下分析与自下而上分 析。 1、自上而下分析方法 实际上是一种产生的方法,分析过程是一个推导过程。 ⑴自上而下分析过程
从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与 输入的符号串完全相匹配的句子。采用最左推导,以文法开始符号为 根结点,逐步为输入串自上而下地构造一棵语法树。 面临的输入符号为a,A所有的产生式: A
⑴消除文法中的左递归; ⑵消除文法中的回溯问题。 2、消除文法的左递归 文法的左递归可以通过对文法产生式进行改写,使之不含有左递 归的非终结符号。左递归一般有两种情况,直接左递归和间接左递 归。 ⑴直接左递归 如果文法中任意一个非终结符P,若PP(V UV ),并且在最左推 导中有PP形式,称为直接左递归。 ⑵间接左递归 在最左推导中有PP形式,称为间接左递归。 ①消除直接左递归 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 12 改写为: P→1P2P………
N 4、若XVN
3、若XV
,X,则FIRST(X)
求FOLLOW(E): 因为 F→(E) ,所以FIRST())加入FOLLOW(E)中, FOLLOW(E) = ) ; 又因为E→TE`,E是文法的开始符号,则#加至FOLLOW(E)中,所以 FOLLOW(E)= # U FOLLOW(E)= #,) 。 求FOLLOW(E`): 因为E→TE`, 满足算法(3)若A →B是一个产生式,则 把FOLLOW(A)加至FOLLOW(B)中,所以 FOLLOW(E`)= FOLLOW(E)U FOLLOW(E) = #,) 求FOLLOW(T): 因为E→TE`, 满足算法⑵若A →B 是一个产生式,则把 FIRST(β)\{ε}加至FOLLOW(B)中,所以 FOLLOW(T) = FOLLOW(T) U FIRST(E`)\{ε} = {+} 又因为E`,满足算法(3)若A→B 是一个产生式,而 ,则把FOLLOW(A)加至FOLLOW(B)中。所以 FOLLOW(T) = FOLLOW(E) U FOLLOW(T) = #,) U + = #,),+ 求FOLLOW(T`): 因为T→FT`,满足算法(3)若A →B是一个产生式,则 把FOLLOW(A)加至FOLLOW(B)中,所以 FOLLOW(T) = FOLLOW(T) U FOLLOW(T`) = #,),+ 求FOLLOW(F): 因为T→FT`, 满足算法⑵若A →B 是一个产生式,则把 FIRST(β)\{ε}加至FOLLOW(B)中,所以 FOLLOW(F) = FOLLOW(F) U FIRST(T`)\{ε}= {*} 又因为T`,满足算法(3)若A→B 是一个产生式,而 ,则把FOLLOW(A)加至FOLLOW(B)中。所以 FOLLOW(F) = FOLLOW(T) U FOLLOW(F) = #,),+ U * = #,),+,* 连续使用上述三条规则,直到每个FOLLOW不再增大为止。 FOLLOW(E)= FOLLOW(E)= #,)
第四章 语法分析—自上而下分析 知识结构: 带回溯分析法 回溯 自上而下分析 面临的问题 左递归 问题的解决 语法分析- 求FIRST、FOLLOW集合的算法 自上而下分析 LL(1)分析法 证明LL(1)文法 构造LL(1)分析表 递归子程序的构造思想 递归子程序法 递归子程序的特点 递归子程序的设计 第一节 语法分析综述 一、语法分析的任务 按照语言即定的语法规则,对字符串形式的源程序进行语法检 查,并识别出相应的语法成分。即语法结构是否符合语法规则。 二、语法分析器在编译程序中的地位(一遍扫描)
N T
m
……
n
i≠
n
P
P→1P2P……… P ③消除间接左递归 A→B… B→C… 间接左递归: AB…C…A… C→A… 例:文法G
m
S→Qc|c Q→Rb|b R→Sa|a 最左推导:SQcRbcSabc(间接左递归) ⑶清除间接左递归 非终结符排序为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 消除S的左递归: R→bcaR | caR | aR R→bcaR | 改写为: S→Qc|c 不能删除 Q→Rb|b 不能删除 R→bcaR|caR|aR R→bcaR| 3、消除回溯,提取左因子 ⑴消除回朔 文法G不包含左递归,则G中非终结符号的每个候选式首字符集 FIRST()为: FIRST()={aa…,aVT ,(V UV ) }若,则 FIRST()。 ⑵提取最左公共因子 采用提取最左公共因子的方法改写文法,使得所有侯选式的首字 符集两两不相交。 A→12 …… n 12 …… m
FOLLOW(T)= FOLLOW(T)= #,),+ FOLLOW(F)= #,),+,* 七、证明上述文法是否为LL(1)文法 对于产生式A: 1、若 ,证明侯选式,的首字符集是否相交。 FIRST()∩FIRST()= Ф 例:F(E)i FIRST(()∩FIRST(i)= Ф 2、若=ε,证明FIRST(A)和FOLLOW(A)是否相交。 FIRST(A)∩FOLLOW(A)=φ 例:E`+TE` FIRST(E`)∩FOLLOW(E`) = +, ∩ ),# =φ 八、构造分析表的算法 1、对文法G的每个产生式A→α执行第二步和第三步; 2、对每个终结符aFIRST(),把A→α加至M[A,a]中; 3、若εFIRST(α),则对任何bFOLLOW(A)把A→α(或A)加至 M[A,b]中; 4、把所有无定义的M[A,a]标上“出错标志” 例: E→TE` , E`→+TE`´|ε T→FT` , T`→*FT`´|ε F→(E)|i 求其FIRST的集合: FIRST(E)=FIRST(T)=FIRST(F)={(,i )} FIRST(E)={ +,ε},FIRST(T)={ *,ε} 求其FOLLOW的集合: FOLLOW(E)= FOLLOW(E)= #,) FOLLOW(T)= FOLLOW(T)= #,),+ FOLLOW(F)= #,),+,* 根据算法构造LL(1)的分析表:
定义算符(广义讲是文法的终结符号)之间的某种优先和结合关 系,借助这种关系来寻找并确定可归约字符串,并进行归约。 ②LR分析法 是一类自左向右对输入串进行扫描的自下而上分析方法,分析过 程是规范归约的序列。适用于语法分析器的自动构造。 第二节 自上而下分析面临的问题 一、不确定的自上而下分析方法 是从文法的开始S出发,试图用一切可能的方法向下推导,产生句 子,这种分析过程的本质是一种试探推导过程。 例:文法G ⑴ S aAd ⑵ A aba 构造W=aad的最左推导:SaAdaad。 构造语法树: ①产生树的根结点,即文法的开始符号。 ②选用文法G的文法规则去延伸树。 ③判断当前延伸的子结与输入串扫描到的字符是否匹配。 ④若不匹配注销掉当前延伸的子树,选用文法规则的另一个产生 式延伸分析树。 ⑤直到输入串与语法树末端结点相匹配,分析结束。 S S S a A d a A d a A d a b a 这种试探识别句子的过程,只会使分析的过程不确定。 二、不确定性的原因 由于分析过程中选择的侯选式不确定,造成输入串匹配的假象, 甚至会导致算法实现的失败。 1、左递归问题 由于采用最左推导,左递归将使得输入串的分析过程陷入无限循 环之中。 2、回溯问题 ⑴采用试探的方法,如匹配不成功回溯到前面分析的某一步。 ⑵可能出现假匹配,造成对输入串识别的失败。 ⑶不能准确报告输入串的出错位置。 三、确定的自上而下分析方法 1、确定的自上而下分析方法的必要条件
1 2n i i
①若aFISRT( ),则指派去执行匹配任务。 ②若a不属于任何一个候选首字符集,则: a、若 属于某个FISRT( )且aFOLLOW(A),则让A与自动匹配; b、否则,a的出现是一种错误。 例:设有文法G和输入符号串W:a*a+a G:S aAa A BaA B + -*/ 推导过程: SaAaBaAa*aAa*aBaAa*a+aAa*a+a=W 构造语法树: S a A B a A * B a A + ⑵自上而下分析法 自上而下分析法又可分为确定和不确定的两种。 ①不确定的分析法(带回溯) 是一种穷举的试探方法,效率低、代价高,极少使用。 ②确定的分析法(不带回溯) 实现方法简单、直观,便于手工构造或自动生成语法分析器,是 目前常用的方法之一。但是对文法有一定的限制。 2、自下而上分析法 ⑴自下而上分析过程 分析过程是归约过程。从给定的输入串W开始,不断寻找与文法G 中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。 ⑵自下而上分析法 ①算符优先分析法
பைடு நூலகம்
n
N T * T,则aFIRST(X)。
T
,则 FIRST(X)={X}。 ,且有产生式Xa,aV
N
1 2 i VN , 而有产生式X Y1 ,,Yn 。当Y1 ,Y2 ,,Yi-1 都 时,(其中 1≤i≤n),则FIRST(Y1 ,)-{},,FIRST(Yi-1 )-{}, FIRST(Yi )都包含在FIRST(X)中。若FIRST(Yj )包含把加到
N T *
提取公因子: A→(12 …… n) 改写后为: A→A 12 …… m
12
……
m
A→12 …… 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(V UV ) 1、若XV 2、若XV
源程序 语法分析器 词法分析器 语义分析 中间代码生成 取下一个单词 符号表 单词符号 分析树
三、语法分析方法 通常把语法分析方法分为两大类,既自上而下分析与自下而上分 析。 1、自上而下分析方法 实际上是一种产生的方法,分析过程是一个推导过程。 ⑴自上而下分析过程
从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与 输入的符号串完全相匹配的句子。采用最左推导,以文法开始符号为 根结点,逐步为输入串自上而下地构造一棵语法树。 面临的输入符号为a,A所有的产生式: A
⑴消除文法中的左递归; ⑵消除文法中的回溯问题。 2、消除文法的左递归 文法的左递归可以通过对文法产生式进行改写,使之不含有左递 归的非终结符号。左递归一般有两种情况,直接左递归和间接左递 归。 ⑴直接左递归 如果文法中任意一个非终结符P,若PP(V UV ),并且在最左推 导中有PP形式,称为直接左递归。 ⑵间接左递归 在最左推导中有PP形式,称为间接左递归。 ①消除直接左递归 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 12 改写为: P→1P2P………
N 4、若XVN
3、若XV
,X,则FIRST(X)
求FOLLOW(E): 因为 F→(E) ,所以FIRST())加入FOLLOW(E)中, FOLLOW(E) = ) ; 又因为E→TE`,E是文法的开始符号,则#加至FOLLOW(E)中,所以 FOLLOW(E)= # U FOLLOW(E)= #,) 。 求FOLLOW(E`): 因为E→TE`, 满足算法(3)若A →B是一个产生式,则 把FOLLOW(A)加至FOLLOW(B)中,所以 FOLLOW(E`)= FOLLOW(E)U FOLLOW(E) = #,) 求FOLLOW(T): 因为E→TE`, 满足算法⑵若A →B 是一个产生式,则把 FIRST(β)\{ε}加至FOLLOW(B)中,所以 FOLLOW(T) = FOLLOW(T) U FIRST(E`)\{ε} = {+} 又因为E`,满足算法(3)若A→B 是一个产生式,而 ,则把FOLLOW(A)加至FOLLOW(B)中。所以 FOLLOW(T) = FOLLOW(E) U FOLLOW(T) = #,) U + = #,),+ 求FOLLOW(T`): 因为T→FT`,满足算法(3)若A →B是一个产生式,则 把FOLLOW(A)加至FOLLOW(B)中,所以 FOLLOW(T) = FOLLOW(T) U FOLLOW(T`) = #,),+ 求FOLLOW(F): 因为T→FT`, 满足算法⑵若A →B 是一个产生式,则把 FIRST(β)\{ε}加至FOLLOW(B)中,所以 FOLLOW(F) = FOLLOW(F) U FIRST(T`)\{ε}= {*} 又因为T`,满足算法(3)若A→B 是一个产生式,而 ,则把FOLLOW(A)加至FOLLOW(B)中。所以 FOLLOW(F) = FOLLOW(T) U FOLLOW(F) = #,),+ U * = #,),+,* 连续使用上述三条规则,直到每个FOLLOW不再增大为止。 FOLLOW(E)= FOLLOW(E)= #,)
第四章 语法分析—自上而下分析 知识结构: 带回溯分析法 回溯 自上而下分析 面临的问题 左递归 问题的解决 语法分析- 求FIRST、FOLLOW集合的算法 自上而下分析 LL(1)分析法 证明LL(1)文法 构造LL(1)分析表 递归子程序的构造思想 递归子程序法 递归子程序的特点 递归子程序的设计 第一节 语法分析综述 一、语法分析的任务 按照语言即定的语法规则,对字符串形式的源程序进行语法检 查,并识别出相应的语法成分。即语法结构是否符合语法规则。 二、语法分析器在编译程序中的地位(一遍扫描)
N T
m
……
n
i≠
n
P
P→1P2P……… P ③消除间接左递归 A→B… B→C… 间接左递归: AB…C…A… C→A… 例:文法G
m
S→Qc|c Q→Rb|b R→Sa|a 最左推导:SQcRbcSabc(间接左递归) ⑶清除间接左递归 非终结符排序为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 消除S的左递归: R→bcaR | caR | aR R→bcaR | 改写为: S→Qc|c 不能删除 Q→Rb|b 不能删除 R→bcaR|caR|aR R→bcaR| 3、消除回溯,提取左因子 ⑴消除回朔 文法G不包含左递归,则G中非终结符号的每个候选式首字符集 FIRST()为: FIRST()={aa…,aVT ,(V UV ) }若,则 FIRST()。 ⑵提取最左公共因子 采用提取最左公共因子的方法改写文法,使得所有侯选式的首字 符集两两不相交。 A→12 …… n 12 …… m
FOLLOW(T)= FOLLOW(T)= #,),+ FOLLOW(F)= #,),+,* 七、证明上述文法是否为LL(1)文法 对于产生式A: 1、若 ,证明侯选式,的首字符集是否相交。 FIRST()∩FIRST()= Ф 例:F(E)i FIRST(()∩FIRST(i)= Ф 2、若=ε,证明FIRST(A)和FOLLOW(A)是否相交。 FIRST(A)∩FOLLOW(A)=φ 例:E`+TE` FIRST(E`)∩FOLLOW(E`) = +, ∩ ),# =φ 八、构造分析表的算法 1、对文法G的每个产生式A→α执行第二步和第三步; 2、对每个终结符aFIRST(),把A→α加至M[A,a]中; 3、若εFIRST(α),则对任何bFOLLOW(A)把A→α(或A)加至 M[A,b]中; 4、把所有无定义的M[A,a]标上“出错标志” 例: E→TE` , E`→+TE`´|ε T→FT` , T`→*FT`´|ε F→(E)|i 求其FIRST的集合: FIRST(E)=FIRST(T)=FIRST(F)={(,i )} FIRST(E)={ +,ε},FIRST(T)={ *,ε} 求其FOLLOW的集合: FOLLOW(E)= FOLLOW(E)= #,) FOLLOW(T)= FOLLOW(T)= #,),+ FOLLOW(F)= #,),+,* 根据算法构造LL(1)的分析表:
定义算符(广义讲是文法的终结符号)之间的某种优先和结合关 系,借助这种关系来寻找并确定可归约字符串,并进行归约。 ②LR分析法 是一类自左向右对输入串进行扫描的自下而上分析方法,分析过 程是规范归约的序列。适用于语法分析器的自动构造。 第二节 自上而下分析面临的问题 一、不确定的自上而下分析方法 是从文法的开始S出发,试图用一切可能的方法向下推导,产生句 子,这种分析过程的本质是一种试探推导过程。 例:文法G ⑴ S aAd ⑵ A aba 构造W=aad的最左推导:SaAdaad。 构造语法树: ①产生树的根结点,即文法的开始符号。 ②选用文法G的文法规则去延伸树。 ③判断当前延伸的子结与输入串扫描到的字符是否匹配。 ④若不匹配注销掉当前延伸的子树,选用文法规则的另一个产生 式延伸分析树。 ⑤直到输入串与语法树末端结点相匹配,分析结束。 S S S a A d a A d a A d a b a 这种试探识别句子的过程,只会使分析的过程不确定。 二、不确定性的原因 由于分析过程中选择的侯选式不确定,造成输入串匹配的假象, 甚至会导致算法实现的失败。 1、左递归问题 由于采用最左推导,左递归将使得输入串的分析过程陷入无限循 环之中。 2、回溯问题 ⑴采用试探的方法,如匹配不成功回溯到前面分析的某一步。 ⑵可能出现假匹配,造成对输入串识别的失败。 ⑶不能准确报告输入串的出错位置。 三、确定的自上而下分析方法 1、确定的自上而下分析方法的必要条件