第4章自顶向下语法分析方法 n4.1确定的自顶向下语法分析思想 n 4.2LL(1)文法的判别 n 4.4不确定的自顶向下分析思想 n4.3某些非LL(1)文法到LL(1)文法的等价变换 u回溯一提取公共左因子 u无限循环一消除左递归 n 4.5确定的自顶向下分析方法 u4.5.1递归子程序法 u4.5.2表驱动LL(1)分析程序或预测分析方法 n 本章练习 n 作业 课程目录
1 第4章 自顶向下语法分析方法 n 4.1 确定的自顶向下语法分析思想 n 4.2 LL(1)文法的判别 n 4.4 不确定的自顶向下分析思想 n 4.3 某些非LL(1)文法到LL(1)文法的等价变换 u 回溯——提取公共左因子 u 无限循环——消除左递归 n 4.5 确定的自顶向下分析方法 u 4.5.1 递归子程序法 u 4.5.2 表驱动LL(1)分析程序或预测分析方法 n 本章练习 n 作业 课程目录
4.1确定的自顶向下分析思想p68 n基本方法 u对任何输入串,试图从开始符号出发,自上而下地为输入串建立 一棵语法树,或者说为输入串寻找一个最左推导。 n若有文法G1[S]: n若有文法G2[S]: n 若有文法G3[S]: uS→pAqB uS→ApBq uS→aAd uA→cAda uA→cAa uA→bAS|e uB→dBlb uB→dBb n 判断输入串W=abd? n判断输入串W=pccadd? 判断输入串W=ccap? n过程本质 u某文法符号对应当前输入符号时,有唯一的产生式进行替换并向下推导。 nLL(1)文法 u(A,a)A是语法树上准备进行推导的符号,a是面临的输入符号。 u 如果我们知道所有候选式的SELECT(A→a)、所有候选式FIRST(a)、所有 非终结符号FOLLOW(A)。 u当有产生式:A→a1a2.|an SELECT(A→ai)nSELECT(A→a)=Φ 冈
2 4.1 确定的自顶向下分析思想 p68 n 过程本质 u 某文法符号对应当前输入符号时,有唯一的产生式进行替换并向下推导。 n 若有文法G1[S]: u S → pA|qB u A → cAd|a u B → dB|b n 判断输入串W=pccadd? n 若有文法G2[S]: u S → Ap|Bq u A → cA|a u B → dB|b n 判断输入串W=ccap? n 基本方法 u 对任何输入串,试图从开始符号出发, 自上而下地为输入串建立 一棵语法树,或者说为输入串寻找一个最左推导。 n 若有文法G3[S]: u S → aA|d u A → bAS|ε n 判断输入串W=abd? n LL(1)文法 u (A, a) A是语法树上准备进行推导的符号,a是面临的输入符号。 u 如果我们知道所有候选式的SELECT(A → α)、所有候选式FIRST(α)、所有 非终结符号FOLLOW(A)。 u 当有产生式:A→α1| α2 |.| αn SELECT(A→αi)∩SELECT(A→αj)= φ
LL(1)分析p71 n含义 u第一个L表示从左向右扫描输入符号串; u第二个L表示生成最左推导; u1表示读入一个符号可确定下一步推导。 nLL(1)文法能够对输入串进行有效的。 n无回溯的自上而下分析。 4 同区
3 LL(1)分析 p71 n 含义 u 第一个 L 表示从左向右扫描输入符号串; u 第二个 L 表示生成最左推导; u 1 表示读入一个符号可确定下一步推导。 n LL(1)文法能够对输入串进行有效的。 n 无回溯的自上而下分析
FIRST(a)集合的定义p69 n设G=(Vr,VN,S,P)a∈V* n FIRST(a)={aa==*>aB,aE VT} a u若a=*>e,则e∈FIRST(a) S→ApBq nFIRST (Ap)={a,c} A→cAa nFIRST (Bg)={b,d} B→dBb n因为S的两个候选式FIRST(Ap)∩FIRST(Bq)=Φ,所以 当$与面临的输入符号匹配时,可能出现几种选择? (1)i∈FIRST(Ap),选择S→Ap匹配 (2)i∈FIRST(Bq),选择S→Bq匹配 (3)否则,出错 ☑D)
4 FIRST(α)集合的定义 p69 n 设G=(VT,VN,S,P) α∈V* n FIRST(α)={a|α==*> aβ,a∈VT} u 若α==*>ε,则ε∈FIRST(α) α a . S → Ap|Bq A → cA|a B →dB|b nFIRST(Ap) ={ a,c } nFIRST(Bq) ={ b,d} n 因为S的两个候选式FIRST(Ap)∩ FIRST(Bq)=φ,所以 当S与面临的输入符号i匹配时,可能出现几种选择? (1)i∈FIRST(Ap),选择S → Ap匹配 (2)i∈FIRST(Bq),选择S → Bq匹配 (3)否则,出错
F0LL0W(A)集合的定义p70 A∈VN n FOLL0W(A)={a|S==*>.Aa.,a∈Vr} u若S=>.A,则#∈FOLLOW(A) 0☑#一输入串的结束符也可看作是句子的括号S# S→aAd nFOLLOW (A)={#,a,d} A→bASe n 因为A的两个候选式FIRST(bAS)∩FOLLOW(A)=Φ,所以 当A与面临的输入符号匹配时,可能出现几种选择? (1)i∈FIRST(bAS),选择A→bAS匹配 (2)i∈FO0LL0W(A),选择A→e自动匹配 (3)否则,出错 D
5 FOLLOW(A)集合的定义 p70 A∈VN n FOLLOW(A)={ a|S==*>.Aa. ,a∈VT } u 若S==*>.A,则#∈FOLLOW(A) Ø#—输入串的结束符 也可看作是句子的括号 #S# S .Aa. S → aA|d A → bAS|ε nFOLLOW(A)={#, a, d} n 因为A的两个候选式FIRST(bAS)∩FOLLOW(A)=φ,所以 当A与面临的输入符号i匹配时,可能出现几种选择? (1)i∈FIRST(bAS),选择A → bAS匹配 (2)i∈FOLLOW(A),选择A → ε自动匹配 (3)否则,出错