1 / 12

内容回顾

内容回顾. 消除二义性 消除左递归 消除左因子 递归下降预测分析(递归下降子程序) 文法,状态迁移关系, EBNF ,递归下降子程序 下推自动机*. 输入缓冲区 (被分析的符号串). 预测分析程序. 输出流. 栈 ( 文法符号串 ) 初始时栈中除了 $ 以外,只含有文法的开始符号. X. Y. Z. $. 分析表 M. a. +. b. $. 3.4 自上而下语法分析. 非递归的预测分析 不采用递归调用 预测分析器的关键是如何选择一个非终结符的产生式 非递归的预测分析器 通过检查分析表来选择产生式(表驱动的预测分析器).

delano
Download Presentation

内容回顾

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 内容回顾 • 消除二义性 • 消除左递归 • 消除左因子 • 递归下降预测分析(递归下降子程序) • 文法,状态迁移关系,EBNF,递归下降子程序 • 下推自动机*

  2. 输入缓冲区 (被分析的符号串) 预测分析程序 输出流 栈 (文法符号串) 初始时栈中除了$以外,只含有文法的开始符号 X Y Z $ 分析表M a + b $ 3.4 自上而下语法分析 • 非递归的预测分析 不采用递归调用 • 预测分析器的关键是如何选择一个非终结符的产生式 • 非递归的预测分析器通过检查分析表来选择产生式(表驱动的预测分析器) 分析表是二维数组M[A,a] A为非终结符,a为终结符或者$

  3. 输入缓冲区 (被分析的符号串) 预测分析程序 输出流 栈 (文法符号串) 初始时栈中除了$以外,只含有文法的开始符号 X Y Z $ 分析表M a + b $ 3.4 自上而下语法分析 PA 分析表是二维数组M[A,a] A为非终结符,a为终结符或者$

  4. 输入缓冲区 预测分析程序 输出流 栈 X Y Z $ 分析表M a + b $ 3.4 自上而下语法分析 • 分析器工作过程 • 预测分析程序根据当前栈顶符号X和输入符号a决定分析器的动作(4种情况) • 如果X=a=$,分析器宣布分析成功并停机 分析表是二维数组M[A,a] • 如果X=a$,分析器弹出栈顶符号X, 并推进输入指针,指向下一个输入符号 • 如果X是终结符但不是a,则分析器报告发现语法错误(调用错误处理) • 如果X是非终结符,分析器访问分析表M,若M[X,a]是X的产生式(M[X,a]={XUVW}),用UVW代替栈顶。如果M[X,a]提示错误,则分析器调用错误恢复

  5. 驱动器算法 算法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;

  6. 3.4 自上而下语法分析 • 预测分析表的构造 • 非递归预测分析方法的特征是预测分析器与文法无关,所有预测分析器的驱动器都是相同的,而唯一不同的是预测分析表 • 因此,所谓构造预测分析器,实际上就是构造给定文法的预测分析表

  7. 预测分析器根据分析表 检测输入id * id + id是否 能有文法表达

  8. 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)。 通俗地讲,α的FIRST集合就是从α开始可导出的文法符号序列中的开头终结符。 而A的FOLLOW集合,就是从开始符号可以导出的所有含A的文法符号序列中A之后的终结符。

  9. 例如: L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num 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

  10. 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), 0ij则加入a到FIRST(X)。 FIRST(X1X2...Xn)的计算方法:所有FIRST(Xi) (i=1,2,..,k)的并集,其中k为第一个具有性质ε不属于FIRST(Xk)的文法符号 X1X2...Xk…Xn FIRST(X1) FIRST(X2) ...  FIRST(X(k))

  11. 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产生式右部最右的文法符号

  12. 加#到FOLLOW(S),其中S是开始符号,#是输入结束标记加#到FOLLOW(S),其中S是开始符号,#是输入结束标记 • 若有产生式A→αBβ,则除ε外,FIRST(β)的全体加入到FOLLOW(B)。 • 若有产生式A→αB或A→αBβ且ε∈FIRST(β),则FOLLOW(A)的全体加入到FOLLOW(B)。 3.4 自上而下语法分析 [例3.22] 计算非终结符的FIRST与FOLLOW。 提示:自下而上计算FIRST,自上而下计算FOLLOW FIRST(F) = {( ,id, num} FIRST(T‘) = {* , / , mod, ε} FIRST(T) = FIRST(F) = {( , 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‘) ={+, - ,* ,/ ,mod ,) ;} L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num

More Related