第08讲-语法-III素材.pptx

本讲纲要 回顾 重点:FIRST集、FOLLOW集 LL(1)文法 自上而下分析实现 递归函数法 非递归的预测分析方法 构造预测分析表 1 FIRST集和FOLLOW集 FIRST (? )={a | ? ?* a…, a ? VT} 计算满足? 的句子的所有可能开头字符 特殊情况:当? ?* ?时,规定? ? FIRST (? ) FOLLOW (A) = {a | S ?* …Aa…,a?VT} 计算语言的句型中所有可能跟在A后面的字符 特殊情况:如果A是某个句型的最右符号,那么$属于FOLLOW(A) 2 FIRST集合及FOLLOW集合的计算方法 FIRST集合计算方法 若X?a.., 则将终结符a加入FIRST(X)中 若X??,则将?加入FIRST(X)中 若X?Y…,且Y属于非终结符,则将FIRST(Y)\{?}加入到FIRST(X)中 若X?Y1Y2..YK,且Y1,Y2,..Yi-1 (2≤i≤k)都是非终结符,且Y1,Y2,..Yi-1 的FIRST集合中均包含?,则将FIRST(Yj)的所有非?元素加入到FIRST(X)中,(j=1,2,..i).特别地,若Y1~YK均有?产生式,则将?加到FIRST(X)中。 3 S?BA A?BS|d B?aA|bS|c FIRST(S)=FIRST(B) FIRST(A)=FIRST(B) ∪ {d} FIRST(B)={a,b,c} 步骤1: FIRST集和FOLLOW集 FIRST (? )={a | ? ?* a…, a ? VT} 计算满足?的句子的所有可能开头字符 特殊情况:当? ?* ?时,规定? ? FIRST (? ) FOLLOW (A) = {a | S ?* …Aa…,a?VT} 计算语言的句型中所有可能跟在A后面的字符 特殊情况:如果A是某个句型的最右符号,那么$属于FOLLOW(A) 4 A的FOLLOW集合,是从开始符号可以导出的所有含A的文法符号序列中紧跟A之后的终结符。 α的FIRST集合是从α开始可以导出的文法符号序列中的开头终结符。 FOLLOW集合的计算方法 FOLLOW集合计算方法 对文法开始符号S,置$于FOLLOW(S)中。 若有A??B?,则将FIRST(?)\{?} 加入FOLLOW(B)中。 (此处? 可以为空) 若A?? B 或A?? B ?,且 ? ?* ?(即? 属于FIRST(?)),则将 FOLLOW(A)加入FOLLOW(B)中 (此处? 可以为空)。 5 S?BA A?BS|d B?aA|bS|c FIRST(B)={a,b,c} FIRST(A)={a,b,c,d} FIRST(S)={a,b,c} FOLLOW(S)=? FOLLOW(A)=? FOLLOW(B)=? FOLLOW集计算 文法 6 S?BA A?BS|d B?aA|bS|c 第1步: FOLLOW(S) - $ FOLLOW(S)={$} FOLLOW(A)={} FOLLOW(B)={a,b,c,d} 第2步: FOLLOW(B) += FIRST(A) FOLLOW(B) += FIRST(S) FIRST(B)={a,b,c} FIRST(A)={a,b,c,d} FIRST(S)={a,b,c} FOLLOW集计算 文法 7 S?BA A?BS|d B?aA|bS|c 第1步: FOLLOW(S) - $ FOLLOW(S)={$} FOLLOW(A)={a,b,c,d} FOLLOW(B)={a,b,c,d} 第2步: FOLLOW(B) += FIRST(A) FOLLOW(B) += FIRST(S) FIRST(B)={a,b,c} FIRST(A)={a,b,c,d} FIRST(S)={a,b,c} FOLLOW(B)中的所有元素都可以加到FOLLOW(A)中 FOLLOW集计算 文法 8 S?BA A?BS|d B?aA|bS|c 第1步: FOLLOW(S) - $ FOLLOW(S)={a,b,c,d,$} FOLLOW(A)={a,b,c,d} FOLLOW(B)={a,b,c,d} 第2步: FOLLOW(B) += FIRST(A) FOLLOW(B) += FIRST(S) FIRST(B)={a,b,c} FIRST(A)={a,b,c,d} FIRST(S)={a,b,c} FOLLOW(B)中的所有元素都可以加到FOLLOW(A)中 FOLLOW(B)中的所有元素都可以加到FOLLOW(S)中 FOLLOW集计算 文法 9 S?BA A?BS|d

文档评论(0)

1亿VIP精品文档

相关文档