收藏 分享(赏)

编译原理第四章 (1).ppt

上传人:tkhy51908 文档编号:8023715 上传时间:2019-06-04 格式:PPT 页数:61 大小:896KB
下载 相关 举报
编译原理第四章 (1).ppt_第1页
第1页 / 共61页
编译原理第四章 (1).ppt_第2页
第2页 / 共61页
编译原理第四章 (1).ppt_第3页
第3页 / 共61页
编译原理第四章 (1).ppt_第4页
第4页 / 共61页
编译原理第四章 (1).ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、1,第四章 语法分析(Parsing / Syntax Analysis) 自顶向下分析方法,Grammar / Syntax: the way in which words are put together to form phrases, clauses, or sentences.,Parse: to analyze or separate into more easily processed components.,2,在设计语言时,每种程序设计语言都有一组精确的规则来描述良构(well-formed)程序的语法结构。 高级语言的大部分语法结构可用上下文无关文法描述,因而宜于将上下文无

2、关文法用作语法分析的基础。,3,语法分析在编译程序中的逻辑位置,表 处 理,错 误 处 理,目 标 代 码 生 成,中 间 代 码 优 化,中 间 代 码 生 成,语 义 分 析,语 法 分 析,词 法 分 析,目 标 程 序,源 程 序,4,语法分析程序的功能 语法分析方法的分类: 自顶向下语法分析方法 (Top-Down) 自底向上语法分析方法 (Bottom-Up) 两种自顶向下语法分析方法: 非确定的自顶向下语法分析方法 确定的自顶向下语法分析方法: 递归下降子程序方法 LL(1)方法 First 集、Follow集、 Predict集,主 要 内 容,5,语法分析的任务是: 把词法分

3、析的输出作为输入,按照文法规则,从源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备; 抽象地说语法分析就是已知文法,判断一给定的字符串是否是该文法的句子; 词法分析给出的单词的内部表示是上下文无关文法中的终极符。,4.1 语法分析程序介绍,4.1.1 语法分析程序的功能,6,设有文法G:E T | E + TT F | T * FF ( E ) | Int | Id,Int 0| 1 Int| 2 Int| 3 Int| 4 Int| 5 Int| 6 Int| 7 Int| 8 Int| 9 IntInt | 0 Int| 1 Int| 2 Int| 3 Int

4、| 4 Int| 5 Int| 6 Int| 7 Int| 8 Int| 9 Int,Id a Id| b Id| y Id| z Id| A Id| B Id.| Y Id| Z IdId | a Id| z Id| A Id.| Z Id| 0 Id.| Z Id| 0 Id,单词内部表示是上下文无关文法中的终极符?,设有文法G:E T | E + TT F | T * FF ( E ) | int | id,4.1.1 语法分析程序的功能(续2),设有文法G:E T | E + TT F | T * FF ( E ) |($ int,- ) |($id,-),7,词法分析时作为字符串的单

5、词的形式化式 描述( 3型文法,自动机及正则表达):终极符?,语法分析时作为字符串的程序的2型文法描述:终极符?,4.1.1 语法分析程序的功能(续3),8,例 某程序片段如下: sum:=first + count * 10,($id, sum ) ($assi, ) ($id, first ) ($plus, ) ($id, count ) ($mult, ) ($int, 10),$id $assi $id $plus $id $mult $int,4.1.1 语法分析程序的功能(续4),id := id + id * int,9,语法分析器( Parser ):执行语法分析任务的程序称

6、为语法分析程序,也称为语法分析器。 分析器(程序)和识别器 (程序)的区别识别器的主要功能是识别输入的字符串是否合法;分析器的功能是识别输入字符串的合法性和语法结构。 单词里不能再包含其它结构,即单词是不可分的简单对象,因此单词处理实际上用的是识别器。 编译器在进行语法处理时,需要识别和分解程序中的各种成分,因此语法处理需要用分析器。,4.1.1 语法分析程序的功能(续5),10,编译程序的后续部分,语法树/语法错误信息,源程序的CharList,词法分析后的TokenList,4.1.1 语法分析程序的功能(续6),11,编译程序的 后续部分,语法树/语法错误信息,源 程 序,4.1.1 语

7、法分析程序的功能(续7),12,语法分析方法的分类: 自顶向下语法分析方法(Top-Down) ,亦称面向目标的分析方法; 自底向上语法分析方法(Bottom-Up) 。,4.1.1 语法分析程序的功能(续8),13,自顶向下分析概述,从文法开始符出发试图推导出所给的终极符串。例 Gz : 1 Z aBd 2 B d3 B c 4 B bB对给定的终极符串abcd,推导过程:,自顶向下的语法分析过程【St,Rest,Action(D/M/S/E)】,Z #,abcd #,Derivation,Z 1 aBd,4 abBd,3 abcd,Bd #,abcd #,Match,aBd #,bcd #

8、,Derivation,bBd #,bcd #,Match,Bd #,cd #,Derivation,cd #,cd #,Match,Success,d #,d #,#,#,Match,14,自底向上分析概述,从终极符串出发归约(reduce)出文法的开始符。例 Gz : 1 Z aBd 2 B d3 B c 4 B bB对给定的终极符串abcd,归约过程:,自底向上的语法分析过程【Analysis ST,Input,Action(S/R/E/S)】,a,b,c,d,B,B,Z,#,abcd,3 abBd,4 aBd,3 Z,#a,bcd #,Shift,#ab,cd #,Shift,#abc

9、,d #,Reduce3,#abB,d #,Reduce4,#aB,d #,Shift,#aBd,#,Reduce1,#Z,#,Success,abcd #,Shift,15,4.1.2 语法错误的处理原则,源程序中可能出现的错误 词法错误非法字符等,如: 。 语法错误语法错误是指语法结构出错,常见错误有: 程序的开始符,语句(表达式)的开始符(后继符)错; 标识符(常量)错:该出现时未出现; 括号类错误:不匹配; 分隔符错。例如: begin x:=a+b y:=x;,16,语义错误 静态语义错误:如类型不一致、参数不匹配等;如:a,b:integer; x:array110 of inte

10、ger;x:=a+b; 动态语义错误(逻辑错误):如无穷递归、变量为零时作除数等。如: while (t) .; a:=a/b;,大多数错误的诊断和恢复集中在语法分析阶段。一个原因是大多数错误是语法错误,另一个原因是语法分析方法的准确性,它们能以非常有效的方法诊断语法错误。在编译的时侯,想要准确诊断语义或逻辑错误有时是很困难的。,4.1.2 语法错误的处理原则 (续1),17,4.1.2 语法错误的处理原则 (续2),语法错误处理的目标 对语法错误的处理,一般希望达到以下基本目标:清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;迅速地从每个错误中恢复过来(以便分析继续进行);不应

11、使语法正确源程序的分析速度降低太多。,18,语法错误的基本恢复策略 紧急方式恢复:抛弃若干输入,直到遇到同步记号。 短语级恢复:采用串替换的方式对剩余输入进行局部纠正(抛弃插入)。 出错产生式:用出错产生式捕捉错误(预测错误)。预置型的短语级恢复方式。 全局纠正:对错误输入序列x,找相近序列y,使得x变换成y所需的修改、插入、删除次数最少。,4.1.2 语法错误的处理原则 (续3),19,例 下述两条是有语法错误的语句,其中第一条赋值句结束时忘记加分号,采用紧急恢复方式和短语级恢复方式的可能结果分别如下所示。x := a + by := c + d; 紧急方式: x := a + b + d;

12、注:丢弃b之后的若干记号,直到遇到同步记号+为止。 短语级恢复:x := a + b; y := c + d; 注:加入分号,使之成为一个赋值句。,4.1.2 语法错误的处理原则 (续4),20,4.1.3 自顶向下语法分析基本思想,自顶向下语法分析方法,亦称面向目标的分析方法。 思想:从文法的开始符出发企图用最左推导推导出与输入的单词串完全相匹配的句子。若输入的单词串是给定文法的句子,则必能推出,反之必然以推导失败而终止。 自顶向下语法分析方法分为:1、非确定的自顶向下语法分析方法;2、确定的自顶向下语法分析方法:实现方法简单、直观,便于手工构造和自动生成,是目前常用的语法分析方法。递归下降

13、方法;LL(1)方法。,21,非确定的自顶向下语法分析方法(带回溯过程的自顶向下语法分析方法),已知GS: SAy | BAyAaAaBxBx 输入串为xay是否正确。, Ay,BAy, aAy,a, xBAy,x, xxBAy,x, xxAy,S, xAy,a,xaAy,a, xaaAy, xaay, xay, ay, BAy,22,综述:非确定的自顶向下语法分析方法是一种穷举的试探方法,由于回溯导致语义推导重来、不能确切报告错误位置、不能处理左递归文法、效率低、代价高,因此,尽管这种方法适合于更广泛的文法,但也只是一种理论上可行的方法,极少使用。,23,确定的自顶向下语法分析方法:实现方法

14、简单、直观,便于手工构造和自动生成,是目前常用的语法分析方法。递归下降方法;LL(1)方法。,24,4.1.4 三个重要的集合,First集 First() = a VT | * a . (if * then else ) Follow集Follow(A) = a VT | S+ .Aa. (if S*. A then # else ) Predict集(Select集),SS#,25,对每一文法符号X计算First(X)集,若X VT :First(X)=X 若X VN : 对关于X的每一个产生式进行如下处理: Step1.形如: X , 则: First(X) Step2.形如:X a ,

15、 a VT则 : a First(X),26,Step3.对形如下的产生式: XY1Y2Yi-1YiYn 若:Y1,Y2, ,Yi VN且Y1,Y2, ,Yi-1* 则: First(Y1)- , First(Y2)- , , First(Yi-1)- , First(Yi)都包含在First(X)中。 若: Yi VN且Yi * (i=1,2,n), 则: First(Y1) , First(Y2), , First(Yn) 都包含在First(X)中。 重复Step3 ,直至对所有AVN,First(A)收敛为止。,对每一文法符号X计算First(X)集,27,例:E T EE + T E

16、 | T F TT * F T | F id | ( E ),文法符号,First集,E,E,T,T,F,+,*,id, (,id, (,id, (,28,计算First()集,若符号串=X1X2Xn, 当X1,X2, , Xi-1*,Xi 不能 * , 则:First()=1i-1(First(Xj)-) First(Xi)若所有Xi 都能*, 则:First()= 1n First(Xj),29,例:E T EE + T E | T F TT * F T | F id | ( E ),符号串,First集,T E, id, ( , id, ( ,F T,E T T, +, *, id, (

17、 ,E T, +, *, ,30,1: 对所有AVN 且 A非开始符 : 令Follow(A):= ;对开始符 S : 令Follow(S)= # ; 2: 若有产生式AxBy:如果 First(y) 则: Follow(B)= Follow(B) (First(y) Follow(A)否则:Follow(B)= Follow(B) First(y) 3: 重复2和3,直至对所有AVN,Follow(A)收敛为止。,计算Follow(A) (AVN ),?,返回,31,例:E T EE + T E | T F TT * F T | F id | ( E ),#, ),#, ), #, ),+,

18、 #, ),+, #, ), +,*,算法回顾,32,计算Predict集,Predict(A) First() ,当First()不含= First()- Follow(A) ,当First()含,33,例:E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( ,34,例:E T EE

19、 + T E | T F TT * F T | F id | ( E ),Predict( T *FT ) = first(*FT) = * Predict( T ) = follow(T) = + , ) , # Predict( F id ) = first(id) = id Predict( F (E) ) = first(E) = ( ,35,例:S ABcA aA B bB ,文法符号,First集,S,A,B,a,a, b,c,b,Follow集,#,c,b,c,Predict(S ABc) = first(ABc) = a,b,c Predict(A a) = = a Predi

20、ct(A ) = follow(A) = b,c Predict(B b) = = b Predict(B ) = follow(B) = c ,36,非确定的自顶向下语法分析方法主要问题:虚假匹配而引起回溯,原因是: 1.由于相同左部的产生式的右部的FIRST集的交集不为空而引起回溯。 例:有如下文法GZ:Z cAe | cAdA eb | a 分析字符串cad 。,First(cAe) First(cAd) ,Predict(Z cAe) Predict(ZcAd) ,至多有一个产生式被选择的条件是: predict(Ak)predict(Aj)=,当kj,NEXT,37,2.由于某非终极

21、符的产生式的右部能推导出,且该非终极符的FOLLOW集中含有其某个产生式右部的FIRST集中的元素。 例:有如下文法GS:S aAS | bA bAS | | d 分析字符串ab 。,First(bAS) First(d) = ,Predict(A bAS) Predict(A ) ,至多有一个产生式被选择的条件是: predict(Ak)predict(Aj)=,当kj,First(bAS) First() = ,First(d) First() = ,Follow(A) = b,a,Predict(A d) Predict(A ) = ,NEXT,Predict(A d) Predict(

22、A bAS) = ,38,3.由于文法的左递归。 例:有如下文法GS:S Sa S b 分析字符串baa。,Predict(S Sa ) Predict(S b) ,至多有一个产生式被选择的条件是: predict(Ak)predict(Aj)=,当kj,该条件就是不带回溯的自顶向下语法分析方法(确定的自顶向下语法分析方法)的条件。,满足该条件的文法称为LL(1)文法,递归下降子程序文法。,NEXT,39,非LL(1)文法到LL(1)文法的等价转换,消除左公共前缀 消除直接左递归 消除左递归,注意1:即使文法没有公共前缀和左递归也并不意味着文法一定是LL(1)文法,有时还需要其它的转换方法。,

23、示例1,注意2:通常程序设计语言的文法大都可以转换成LL(1)文法,但已经证明,非LL(1)文法是存在的,即有些文法是无法变换成LL(1)文法的。,示例2,40,4.2 递归下降法 4.2.1 递归下降法语法分析原理,递归下降法(Recursive-Descent Parsing)对每个非终极符构造相应的一个子程序(称为语法分析子程序),其功能是识别、分析该非终极符所能推导出的字符串。,41,例如:一条产生式:Stmwhile Exp do Stm,则对应产生式右部的语法分析程序部分如下: begin Match(while);Exp;Match(do);Stm end,42,begin Ma

24、tch($while);Exp;Match($do);Stm end,while x y do if x y then x := y +x else y := x,递归下降分析示图,43,4.2.2 递归下降法语法分析程序的构造,一、递归下降法语法分析程序的构造 引进下面两个基本动作: ReadToken:从输入流把下一个TOKEN码读到变量token中。 Match(a):检查token=a? 若是,则执行ReadToken,否则报错并作相应的处理。其中a是终极符(TOKEN的语法信息)。,44,对每一个非终极符A构造子程:当产生式中形如: A 1| 2| | n则按下面的方法编写子程序A:

25、procedure A( )begin if tokenPredict(A1) then (1) elseif tokenPredict(A2) then (2) elseif tokenPredict(An) then (n) elseerr( ) end,语法分析主程序:Begin ReadToken; S ; Match(#) end,45,终极符产生匹配命令,而非终极符则产生调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序方法或递归下降法。,其中:令i=X0X1X2Xn,则:(i) = (X0); (X1); (X2); ; (Xn);如果XVN,(X)= X 如果X

26、VT,(X)= Match(X) 如果X= , () = skip(空语句),46,例:假设有文法Z a B aB b B | c Predict(ZaBa)=a, Predict(BbB)=b, PredictBc=c 则相应的递归子程序可如下: procedure Z( ) begin if token=a then Match(a);B;Match(a) else err( 1 ) end;,procedure B ( ) beginif token = b then Match(b);B;else if token = cthen Match(c);else err( 2 ) end;

27、,语法分析主程序:Begin ReadToken; Z ; Match(#) end,ReadToken,ReadToken,47,例: E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( Predict( T *FT ) = first(*FT) = * Predict( T ) =

28、 follow(T) = + , ) , # Predict( F id ) = first(id) = id Predict( F (E) ) = first(E) = ( ,procedure E( ) begin if token id , ( then T;E ;else err( 1 ) end;,语法分析主程序:Begin ReadToken; E ; Match(#) end,48,procedure E ( ) begin if token=“+” then Match(+); T;E else if token ) , # then skip else err( 2 ) en

29、d;,例: E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( Predict( T *FT ) = first(*FT) = * Predict( T ) = follow(T) = + , ) , # Predict( F id ) = first(id) = id Predict

30、( F (E) ) = first(E) = ( ,49,例: E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( Predict( T *FT ) = first(*FT) = * Predict( T ) = follow(T) = + , ) , # Predict( F id

31、) = first(id) = id Predict( F (E) ) = first(E) = ( ,procedure T( ) begin if token id , ( then F;T else err( 3 ) end;,50,procedure T ( ) begin if token=“ * ” then Match( * ); F;T else if token +,) , # then skip else err( 4 ) end;,例: E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE

32、) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( Predict( T *FT ) = first(*FT) = * Predict( T ) = follow(T) = + , ) , # Predict( F id ) = first(id) = id Predict( F (E) ) = first(E) = ( ,51,procedure F ( ) begin if token=“ id” then Mat

33、ch( id ) else if token=“(” then Match( ( );E; Match( ) )else err( 5 ) end;,例: E T EE + T E | T F TT * F T | F id | ( E ),Predict( ETE ) = first(TE) = id , ( Predict( E +TE ) = first(+TE) = + Predict( E ) = follow(E) = ) , # Predict( T FT ) = first(FT) = id , ( Predict( T *FT ) = first(*FT) = * Predi

34、ct( T ) = follow(T) = + , ) , # Predict( F id ) = first(id) = id Predict( F (E) ) = first(E) = ( ,52,E,T,F,i,i,M(i),E,T,F,i,i,M(i),E,T,F,T,i+i*i # 递归下降分析过程,+,+,+,M(+),*,#,*,M(*),i,#,#,#,skip,#,#,#,#,M(i),skip,ETE E+TE TFT T*FT F(E)i,T,+,+,skip,TE,FT,+TE,FT,i,i,i,*FT,语法分析主程序:Begin ReadToken; E ; Matc

35、h(#) end,53,递归子下降子程序方法的条件:predict(Ak) predict(Aj )=,当k j,二、递归子程序方法的进一步讨论 产生式A被选择的条件是:当前的输入符属于predict(A)。 至多一个产生式被选择的条件是:predict(Ak) predict(Aj )=,当k j,54,三、对递归下降分析法的评价,递归下降分析法的优点是:简单、直观、程序结构和层次清晰明了,易于手工实现; 递归下降分析法的缺点是:对文法要求高;另一个缺点是频繁的递归调用使得速度慢且占用空间多。,55,作业: 写出下面文法Gp的递归下降语法分析程序:P D;S D int:i | D;int:

36、iS i | i:= E | i: S | goto i| if E then S| while E do S| begin L end| L S | L;SE i | (E) | E i,56,练习题: 已知文法GS:SAB | bC A | b B | aDC AD | b D aS | c1、计算每个非终极符的First集、Follow集。2、计算每个产生式的Predict集合。3、判断该文法是否为递归下降文法?,57,SAB | bC A | b B | aDC AD | b D aS | c,58,Predict(SAB ) = a,b,# Predict(S bC ) = b Pr

37、edict( A ) = a, c , # Predict( Ab ) = b Predict( B ) = # Predict( B aD ) = a Predict( C AD ) = a,b,c Predict( C b) = b 由于:Predict(SAB ) Predict(S bC ) = b Predict( C AD ) Predict( C b) = b 所以该文法不是递归下降文法。,59,示例1:设有如下文法:Stm Label : UnLabeledStmStm idUnLabeledStm id:=ExpLabel id,Stm id Stm Stm : UnLabeledStm | UnLabeledStm id:=Exp,Stm id : UnLabeledStm Stm id UnLabeledStm id:=Exp,60,示例2: S if id then S ELSES OtherStmELSE else SELSE ,因: Predict(ELSEelse S)=elsePredict(ELSE)=Follow(ELSE)=else, 该文法不是LL(1)文法。,Follow(ELSE) = Follow(ELSE) Follow(S) Follow(S) = Follow(S) First(ELSE)-,61,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报