西安电子科技大学编译原理 (10)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对文法的每个产生式A→α ② 对FIRST(α)的每个终结符a,加入α 到M[A,a]; ③ 若ε∈FIRST(α),则FOLLOW(A)每 个终结符b(包括#),加入α到M[A, b];
/ mod ( E;L TE' ε ε ) ; # ε
+
-
*
E'
T T' F
id
num
(E)
3.4 自上而下语法分析
预测分析表的构造包括两部分
1. 首先根据文法构造两个集合,FIRST和FOLLOW 2. 然后根据两个集合构造预测分析表 定义3.10 文法符号序列α的FIRST集合为: FIRST(α)={ a |α=*>a...,a∈T},若α=*>ε,则ε∈FIRST(α) 定义3.11 非终结符A的FOLLOW集合如下: FOLLOW(A) = { a |S=*>...Aa...,a∈T}, 若A是某句型的最右符号,则#∈FOLLOW(A)。
内容回顾
消除二义性 消除左递归 消除左因子 递归下降预测分析(递归下降子程序)

文法,状态迁移关系,EBNF,递归下降子程序
下推自动机*
1
3.4 自上而下语法分析
非递归的预测分析
不采用递归调用 预测分析器的关键是如何选择一个非终结符的产生 式 非递归的预测分析器通过检查分析表来选择产生式 (表驱动的预测分析器)
1.
预测分析表
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→ * F T' | / F T' | mod F T' | ε F →(E)|id|num 分析表M[A, a]的内容:若当前栈顶是非终结符A,下一输入终结符 是a,则M[A, a]指示下一步动作。
11
① ② ③
加#到FOLLOW(S),其中S是开始符号,#是输入结束标记 若有产生式A→αBβ,则除ε外,FIRST(β)的全体加入到FOLLOW(B)。 若有产生式A→αB或A→αBβ且ε∈FIRST(β),则FOLLOW(A)的全体加入到FOLLOW(B)。
3.4 自上而下语法分析
[例3.22] 计算非终结符的FIRST与FOLLOW。L →E ; L | ε
9
3.4 自上而下语法分析
算法3.5 计算X的FIRST集合 输入 文法符号X 输出 X的FIRST集合 方法 应用下述规则: ① 若X∈T(终结符),则FIRST(X)={X}; ② 若X是非终结符且有X → ε,则加ε到FIRST(X); ③ 若X是非终结符且有X→Y1Y2...Yk,那么对所有j(1≤j<k),若 a∈FIRST(Yj+1)且ε∈FIRST(Yi), 0ij则加入a到FIRST(X)。
输入缓冲区
(被分析的符号串)
a +b $
栈 (文法符号串)
初始时栈中除 了$以外,只 含有文法的开 始符号
X Y Z $
预测分析程序
输出流
分析表M
分析表是二维数组M[A,a] A为非终结符,a为终结 符或者$
2
3.4 自上而下语法分析
输入缓冲区
(被分析的符号串)
a +b $
栈 (文法符号串)
初始时栈中除 了$以外,只 含有文法的开 始符号
X Y Z $
预测分析程序
输出流
PA
分析表M
分析表是二维数组M[A,a] A为非终结符,a为终结 符或者$
3
3.4 自上而下语法分析
分析器工作过程 预测分析程序根据当前栈
输入缓冲区
a +b$
输出流
顶符号X和输入符号a决定 分析器的动作(4种情况) 如果X=a=$,分析器宣布 分析成功并停机
FIRST(X1X2...Xn)的计算方法:所有FIRST(Xi) (i=1,2,..,k)的并集,其 中k为第一个具有性质ε不属于FIRST(Xk)的文法符号
X1X2...Xk…Xn
FIRST(X1) FIRST(X2) ... FIRST(X(k-1))
10
3.4 自上而下语法分析
算法3.6 计算所有非终结符的FOLLOW集合 输入 文法G 输出 G中所有非终结符的FOLLOW集合 方法 应用下述规则: ① 加#到FOLLOW(S),其中S是开始符号,#是输入结束标记 ② 若有产生式A→αBβ,则除ε外,FIRST(β)的全体加入到 FOLLOW(B)。 ③ 若有产生式A→αB或A→αBβ且ε∈FIRST(β),则FOLLOW(A) 的全体加入到FOLLOW(B)。 步骤3的理解: 若 S =*>δAa a紧跟A之后 则 =*>δαBa a也紧跟B之后 因为 ε∈FIRST(β) 使得B成为A产生式右部最右的文法符号
通俗地讲,α的FIRST集合就是从α开始可导出的文法符号序列中的开 头终结符。 而A的FOLLOW集合,就是从开始符号可以导出的所有含A的文法 符号序列中A之后的终结符。
8
例如:
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
4
3.
驱动器算法
算法3.4 非递归的预测分析 输入 输入序列ω和文法G的预测分析表M 输出 若ω∈L(G),得到ω的一个最左推导;否则指出一个错误 方法 初始格局为: (#S,ω#,分析器的第一个动作) 令ip指向ω#中的第一个终结符,top指向S; loop x := top^; a := ip^; if x∈T then if x=a then pop(x); next(ip); -- 匹配终结符 else error(1); end if; -- 出错:栈顶终结符不是a else if M[x, a] = X→Y1Y2...Yk then pop(X); push(YkYk-1...Y2Y1); --展开非终结 符 else error(2); endif; -- 出错:产生式不匹配 end if; exit when x = a= #; -- 分析成功 end loop;

...
E
T T F F id T FT
T
T FT
6
非终 结符 E E T T
输 入 符 号
id
E TE
+
E +TE

...
T FT T T FT
F
F id





$E
id id + id$
id id + id$ id id + id$ id id + id$ id + id$ id + id$ id + id$ id + id$ F id
提示:自下而上计算FIRST,自上而下计算FOLLOW
E →TE' FIRST(F) = {( ,id, num} E'→ + T E' | - T E' | ε FIRST(T‘) = {* , / , mod, ε} T →FT' FIRST(T) = FIRST(F) = {( , id, num} T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num FIRST(E‘) = {+ , - ,ε} FIRST(E) = FIRST(T) = FIRST(F) = {( ,id,num} FIRST(L) = {ε}∪FIRST(E) = {ε ,( ,id, num} FOLLOW(L) = {#} FOLLOW(E) = {) ,;} FOLLOW(E‘) = FOLLOW(E)={) ,;} FOLLOW(T) = FIRST(E’)\ ε ∪ FOLLOW(E’)= {+ ,- , ; ,)} FOLLOW(T‘) = FOLLOW(T) ={+ ,- , ;, )} FOLLOW(F) = FIRST(T‘)\ ε ∪ FOLLOW(T‘) ={+, - ,* ,/ , 12 mod ,) ;}
3.4 自上而下语法分析
算法3.7 构造预测分析表 输入 文法G 输出 分析表M 方法 应用下述规则 ① 对文法的每个产生式A→α,执行2和3; ② 对FIRST(α)的每个终结符a,加入A→α到M[A,a]; ③ 若ε∈FIRST(α),则对于FOLLOW(A)每个终结符b(包括#), 把A→α到加入M[A,b](包括M[A,#] ); ④ M中其它没有定义的条目均是error。
5
3.4 自上而下语法分析
预测分析表的构造 非递归预测分析方法的特征是预测分析器与文法无
关,所有预测分析器的驱动器都是相同的,而唯一 不同的是预测分析表 因此,所谓构造预测分析器,实际上就是构造给定 文法的预测分析表
非终 结符 E 输 入 符 号
id
E TE
+ E +TE
id L E E' T T' F id num FT' FT' ε ε *FT' /FT' mod FT' (E) E;L TE' num E;L TE' +TE' -TE' FT' ε ε
15
+
ቤተ መጻሕፍቲ ባይዱ
-
*
/
mod
( E;L TE'
)
;
# ε
ε
ε
4.
用预测分析器分析句子
动作 含义 pop(L), push(E;L) (L→E;L) push(TE') (E→TE') pop(T), push(FT') (T→FT') push(id) (F→id) pop(id), next(ip) id pop(T') (T'→ε) pop(E'), push(+TE') (E'→+TE') next(ip) + pop(T), push(FT') (T→FT') push(id) (F→id) pop(id), next(ip) id pop(T'), push(*FT') (T'→*FT') pop(*), next(ip) * push(id) (F→id) pop(id), next(ip) id pop(T') (T'→ε) pop(E') (E'→ε) pop(;), next(ip) ; pop(L) (L→ε) 正确结束
栈 当前剩余输入 #L id+id*id;# #L;E id+id*id;# pop(E), #L;E'T id+id*id;# #L;E'T'F id+id*id;# pop(F), #L;E'T'id id+id*id;# #L;E'T' +id*id;# #L;E' +id*id;# #L;E'T+ +id*id;# pop(+), #L;E'T id*id;# #L;E'T'F id*id;# pop(F), #L;E'T'id id*id;# #L;E'T' *id;# #L;E'T'F* *id;# #L;E'T'F id;# pop(F), #L;E'T'id id;# #L;E'T' ;# #L;E' ;# #L; ;# #L # # #
FIRST(E)={ (,id, num } FOLLOW(E)={ ),; }
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
13
3.4 自上而下语法分析 L →E ; L | ε
FIRST(F/T/E)= {( id num} FIRST(T') = {* / mod ε} FIRST(E') = {+ - ε} FIRST(L) = {ε ( id num} FOLLOW(L) = {#} FOLLOW(E/E')= {) ;} FOLLOW(T/T')= {+ - ; )} FOLLOW(F) = {+ - * / mod ) ;}

X Y Z $
预测分析程序
分析表M
分析表是二维 数组M[A,a]
如果X=a$,分析器弹出栈顶符号X,分析器弹出栈顶符号
X,并推进输入指针,指向下一个输入符号 如果X是终结符但不是a,则分析器报告发现语法错误 (调用错误处理) 如果X是非终结符,分析器访问分析表M,若M[X,a]是X 的产生式(M[X,a]={XUVW}),用UVW代替栈顶。如 果M[X,a]提示错误,则分析器调用错误恢复
id L E E;L TE' FT' num E;L TE' +TE' FT' ε ε *FT' /FT' mod FT' -TE' FT' ε ε
14
E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
7
预测分析器根据分析表 检测输入id * id + id是否 能有文法表达
$E T $E T F $E T id $E T $E T F $E T F $E T id
E TE T FT F id T FT
3.4 自上而下语法分析
相关文档
最新文档