1 / 50

高级语言及其语法描述

1. 2. 3. 4. 5. 6. 引论. 高级语言及其语法描述. 词法分析. 语法分析. 语法分析 — 自下而上. 属性文法和语法制导翻译. 7. 8. 9. 10. 11. 语义分析与中间代码产生. 符号表. 运行时存储空间组织. 优化. 目标代码生成. 从输入串开始,逐步进行“归约”,直至归约到文法开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结点。.  S aAcBe  A b  A Ab  B d. 例如文法 G :. §5.1 自下而上分析基本问题.

admon
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. 1 2 3 4 5 6 引论 高级语言及其语法描述 词法分析 语法分析 语法分析—自下而上 属性文法和语法制导翻译

  2. 7 8 9 10 11 语义分析与中间代码产生 符号表 运行时存储空间组织 优化 目标代码生成

  3. 从输入串开始,逐步进行“归约”,直至归约到文法开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结点。从输入串开始,逐步进行“归约”,直至归约到文法开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结点。

  4.  SaAcBe  Ab  AAb  Bd 例如文法G: §5.1 自下而上分析基本问题 1. 归约——“移进—归约”法 1) 先进后出栈,输入符号一个个移进栈直至栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换成(归约为) 该产生式的左部符号。

  5. a  ab  aA  aAb  aA    aAc  aAcd  aAcB   aAcBe  S  输入串abbcde,归约到S的过程 先后使用、、和四条产生式经四步归约到文法开始符号,若第二步不是使用而是使用,则无法归约成功。

  6. 2) 可归约串 —— 关键问题 第二步为什么是使用而不是?怎样判断栈顶的符号串的可归约性,以及如何归约?这些问题涉及到“可归约串”的精确定义。对这个概念的不同定义形成了不同的自上而下分析法。 用“最左素短语”来刻画“可归约串” ——算符优先分析法; 用“句柄”来刻画“可归约串” ——规范归约分析法

  7. + * 设是文法G的一个句型,若SA且A 2. 规范归约简述 1) 概 念 则称是句型相对于终结符A的短语。特别是,如果有 A 则称是句型相对于规则A的直接短语,一个句型的最左直接短语称为该句型的句柄。 作为短语的两个条件均不可缺少

  8. + 尽管有Ei2+i3,但i2+i3不是该句型的短语,因不存在Ei1E; + 考虑文法 ET|E+T TF|TF (5.2) Fi|(E) 的一个句型i1i2+i3 i1, i2, i3, i1i2, i1i2+i3均是该句型的短语,i1, i2, i3为直接短语,i1为句柄。

  9. 对另一个句型E+TF+i的短语有E+TF+i, E+TF, TF和i, 其中TF和i为直接短语, TF为句柄。

  10. 2) 规范归约 设是G的一个句子,称序列n, n–1, …, 0是的一个规范归约,如果该序列满足: n=; 0=S;  对任何i,0<i≤n, i–1是从i经把句柄替换为相应产生式的左部符号而得到的。

  11. 容易看出,规范归约是关于的一个最右推导的逆过程,因此也称为最左归约。容易看出,规范归约是关于的一个最右推导的逆过程,因此也称为最左归约。 在形式语言中,最右推导常被称为规范推导。由规范推导所得的句型称为规范句型。如果文法是无二义的,则规范推导(最右推导)的逆过程必是规范归约(最左归约)。

  12. 请注意句柄的“最左”特征,这对于移进——归约来说非常重要,因为,句柄的“最左”性和符号栈的栈顶两者是相关的。对规范句型来说,句柄的后面不会出现非终结符。因此,规范归约的实质是,在移进过程中,当发现栈顶呈现句柄时就用相应产生式的左部符号进行替换。请注意句柄的“最左”特征,这对于移进——归约来说非常重要,因为,句柄的“最左”性和符号栈的栈顶两者是相关的。对规范句型来说,句柄的后面不会出现非终结符。因此,规范归约的实质是,在移进过程中,当发现栈顶呈现句柄时就用相应产生式的左部符号进行替换。

  13. S a e A c B   A b d b  例:修剪语法树——阐明自下而上分析过程 至此,还没有解决规范归约的中心问题:如何寻找或确定一个句型的句柄。

  14. 3. 符号栈的使用 栈是语法分析的一种基本数据结构,‘#’既作为栈底符,也作为输入串结束符。 当归约到符号栈内容为:#S,而输入串为#时,表示归约成功,否则含语法错,对文法(5.2),输入串i1i2+i3的归约过程如下:

  15. 步骤 符号栈 输入串 动作0 # i1i2+i3# 预备1 #i1 i2+i3# 进2 #Fi2+i3# 归,Fi3 #Ti2+i3# 归,TF4 #Ti2+i3# 进5 #Ti2 +i3# 进6 #TF+i3# 归,Fi

  16. 步骤 符号栈 输入串 动作7 #T+i3# 归,TTF8 #E+i3# 归,ET9 #E+i3# 进10 #E+i3# 进11 #E+F # 归,Fi12 #E+T # 归,TF13 #E # 归,EE+T14 #E # 接受 分四类操作:移进、归约、接受(最终归约成功),出错处理。

  17. 定义算符之间(终结符之间)的某种优先关系,然后据此进行归约,未必是严格的最左归约,故不是规范归约,但特别利于表达式分析,易于手工实现。定义算符之间(终结符之间)的某种优先关系,然后据此进行归约,未必是严格的最左归约,故不是规范归约,但特别利于表达式分析,易于手工实现。 三种优先关系: < 、=、 >。 . . . §5.2 算符优先分析

  18. 1. 算符优先文法及优先表构造 1) 算符文法 任何产生式右部都不含两个相继(并列)的非终结符,即形如:…QR…形式的文法。 2) 算符优先文法 设G为一个不含产生式的算符文法,对任何一对终结符a, b,称:

  19. a=b当且仅当G中含有形如P…ab…或P…aQb…的产生式(并列) . .  a<b当且仅当G中含有形如P…aR…, 而Rb… 或RQb… (低于) + +  a>b当且仅当G中含有形如P…Rb…, 而R…a 或R…aQ (优于) . + +

  20. . . . . . 则有‘(’ = ‘)’; + < ;  < ; + > +; ( < +; ( < ; ( < ; ( < i; G中决不许含有…) (…或 …)i(…的情形。 . . . 如果一个算符文法G的任何终结符对(a, b)至多满足上述三种关系之一,则称G是一个算符优先文法。 考虑文法G: EE+T|T TTF|F FPF|P P(E)|i (5.3)

  21. + +  FIRSTVT(P)={a|Pa…或PQa…, aVT而Q VN}LASTVT(P)={a|P…a 或P…aQ, aVT而Q VN} + + 3) 构造优先表 用两条规则构造FIRSTVT(P)i. 若有产生式Pa…或PQa…, 则 aFIRSTVT(P)ii. 若aFIRSTVT(Q),且有产生式PQ…, 则aFIRSTVT(P)

  22.  构造FIRSTVT(P)算法 建立布尔数组F[P, a], 当且仅当aFIRSTVT(P)时,元素F[P, a]为真。 首先按规则i对数组元素赋初值,把所有初值为真的符号对(P, a)进栈STACK,然后对栈施行如下运算: 若栈不空,则逐项出栈记为(Q, a),对每个形如PQ…的产生式,若F(P, a)为假,则变为真且(P, a)入栈;反复操作,直至栈空。

  23. 若有产生式其某候选形如…aP…,则对任何bFIRSTVT(P)有a<b,类似,…Pb…,则对任何aLASTVT(P)有a>b。若有产生式其某候选形如…aP…,则对任何bFIRSTVT(P)有a<b,类似,…Pb…,则对任何aLASTVT(P)有a>b。 . . 若有PX1X2…Xn,且有Xi, Xj, (1≤i, j≤n, 且ij)均为终结符,则Xi=Xj。 . 同理构造LASTVT(P) 构造优先表—根据FIRSTVT(P)和LASTVT(P)

  24. FOR i:=1 TO n–1 DO BEGIN IF Xi和Xi+1均为终结符 THEN Xi=Xi+1 IF i ≤ n–2且Xi和Xi+2均为终结符,但Xi+1为 非终结符 THEN Xi=Xi+2 IF Xi为终结符而Xi+1为非终结符 THENFOR FIRSTVT(Xi+1)中的每个a DO置Xi<a; IF Xi为非终结符而Xi+1为终结符 THEN FOR LASTVT(Xi)中的每个a DO置a>Xi+1 END . . . . 算法:FOR每条产生式P X1X2…Xn DO

  25. 2. 算符优先分析算法 1) 素短语 至少含有一个终结符,并且除自身外不再含任何更小的短语的短语。处于句型最左边的那个素短语称最左素短语,如文法(5.3)中,PP和i是句型PP+i的素短语,而PP是其最左素短语。

  26. 2) 分析算法 考虑算符优先算法,把句型的一般形式写成: # N1a1N2a2…NnanNn+1# (5.4) 即句型中含有n个终结符,任何两个终结符间至多只有一个非终结符(可有可无),任何算符文法的句型都具有这种形式(根据算符文法的定义)。

  27. aj–1 < ajaj = aj+1, …, ai–1 = aiai > ai+1 . . . . 可以证明如下定理: 一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1, 根据这个定理,可以直接构造出算符优先分析算法,算法中仅使用一个符号栈S,既用它寄存终结符,也用它寄存非终结符。

  28. 1 k:=1; S[k] := ‘#’; //k为栈的使用深度2 REPEAT3 把下一个输入符号读入a;4 IF S[k]VT THEN j:=k ELSE j:=k–1;5 WHILE S[j] > a DO6 BEGIN7 REPEAT8 Q:=S[j];9 IF S[j–1]VT THEN j:=j–1 ELSE j:=j–2;10 UNTIL S[j]<Q;11 把S[j+1]…S[k]归约为某个N;12 k:=j+1;13 S[k]:=N14 END15 IF S[j] < a OR S[j] = a THEN16 BEGIN k:=k+1; S[k]: = a END17 ELSE ERROR18 UNTIL a=‘#’ . . . .

  29. 若出现j减1后的值小于等于0时,说明输入串有错,算法成功时,S中应为#N#。若出现j减1后的值小于等于0时,说明输入串有错,算法成功时,S中应为#N#。 算法的第11行中,并没有指出应把所找到的最左素短语归约到哪一个非终结符号“N”。N是指这样一个产生式的左部符号,此产生式的右部和S[j+1]…S[k]构成如下一一对应关系:自左至右,终结符对终结符,非终结符对非终结符,而且对应的终结符相同。由于非终结符对归约没有影响,因此,非终结符根本可以不进栈。

  30. 所以,算符优先分析一般并不等价于规范归约。由于未对非终结符定义优先关系,无法发现由单个非终结符组成的“可归约串”,从而也就无法对单非产生式(如PQ)进行归约,所以,跳过了所有单非产生式所对应的归约步骤(比规范归约要快),这一点既是优点又是缺点。因为,忽略非终结符在归约过程中的作用,存在某种危险性,可能导致把本来不成句子的输入串误认为是句子。但这一缺陷容易从技术上加以弥补。所以,算符优先分析一般并不等价于规范归约。由于未对非终结符定义优先关系,无法发现由单个非终结符组成的“可归约串”,从而也就无法对单非产生式(如PQ)进行归约,所以,跳过了所有单非产生式所对应的归约步骤(比规范归约要快),这一点既是优点又是缺点。因为,忽略非终结符在归约过程中的作用,存在某种危险性,可能导致把本来不成句子的输入串误认为是句子。但这一缺陷容易从技术上加以弥补。

  31. 算符优先分析法是一种广为应用、行之有效的方法,不仅可方便用于分析各类表达式,而且就连ALGOL 60这样复杂的语言,只需对其语法稍加修改,也可用此法进行语法分析。

  32. . . 若1<2则f(1)<g(2) . . 若1=2则f(1)=g(2) . . 若1>2则f(1)>g(2) 3. 优先函数  把每个终结符与两个自然数f()和g()相对应,使得 称函数f为入栈优先函数,g为比较优先函数。

  33. 优点:便于作比较运算,节省存储空间。 缺点:原先不存在优先关系的两个终结符,由于与自然数相对应,变成可比较的了,可能掩盖输入串的某些错误。要检查栈顶符号与输入符号a的具体内容来发现那些原先不可比较的情形。

  34. i) 对每个终结符a(包括#)令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图,如果a>=b,则从fa画一箭弧至gb,如果a<=b,则画从gb到fa的箭弧; . . . .  一种从优先关系表构造优先函数的方法 注意:对应一个优先关系表的优先函数f 和g不是唯一的,只要存在一对,就存在多对,也可能不存在,如果优先函数存在,则可这样构造:

  35. ii) 对每个结点都赋予一个数,此数等于从该结点出发所能到达结点(包括出发结点自身在内)的个数,赋给fa的数作为f(a),赋给gb的数作为g(b); iii) 检查f, g,看他们同原来的关系表是否有矛盾(回路),无矛盾则成功,有矛盾则不存在优先函数。

  36. 由于有很多优点,因此,凡可能,应尽量使用优先函数。对一般的表达式文法,其优先函数通常是存在的。

  37. 4. 算符优先分析中的出错处理 1) 发现语法错误的两种可能  若在栈顶终结符号与下一输入符号之间不存在任何优先关系;  若找到某一“句柄” (此处指素短语),但不存在任一产生式,其右部为此“句柄”。

  38. 2) 处理方法  简单处理情况  确定“句柄”与哪个产生式的右部最相似如:“句柄”——abc,若有产生式EaAcB则“非法b”若有产生式Eabcd则“缺少d”  情况处理,对输入串改变、插入或删除符号,使其具有优先关系,但必须注意不要造成无穷的重复过程。

  39. §5.3 LR分析法 是一个有效的自上而下分析方法,可用于很大一类上下文无关文法的语法分析。其中L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程。

  40. 一般地说,大多数用上下文无关文法描述的程序语言都可用LR分析器予以识别。LR分析法比算符优先分析法或其它的“移进—归约”技术更加广泛,而且识别率并不比它们差。能用LR分析器分析的文法类,包含能用LL(1)分析器分析的全部文法类,LR分析法在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。一般地说,大多数用上下文无关文法描述的程序语言都可用LR分析器予以识别。LR分析法比算符优先分析法或其它的“移进—归约”技术更加广泛,而且识别率并不比它们差。能用LR分析器分析的文法类,包含能用LL(1)分析器分析的全部文法类,LR分析法在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。

  41. 这种分析方法的一个最主要的缺点是,若用手工构造分析程序则工作量非常大。因此,必须求助于自动产生这种分析程序的产生器。现在人们已设计出了这样的专用工具,如YACC,使用这种工具可以有效地产生语法分析程序。这种分析方法的一个最主要的缺点是,若用手工构造分析程序则工作量非常大。因此,必须求助于自动产生这种分析程序的产生器。现在人们已设计出了这样的专用工具,如YACC,使用这种工具可以有效地产生语法分析程序。

  42. LR分析器的四种不同分析表的构造方法:  最简单的一种,叫LR(0)表构造法。局限性较大,但它是建立其它较一般的LR分析法的基础。  简单LR(简称SLR)表构造法。虽然有些文法构造不出SLR分析表,但这是一种比较容易实现又极有使用价值的方法

  43. 规范LR表构造法。能力最强,能适用于一大类文法,但实现代价过高,或者说,分析表的体积非常大。  向前LR表构造法(简称LALR)。能力介于SLR和规范LR中间,稍加努力,就可以高效实现。

  44. LR分析器的基本思想: 规范归约的关键问题是寻找句柄。在一般的“移进—归约”过程中,当一串貌似句柄的符号串呈现于栈顶时,有什么方法可确定它是否为相对于某个产生式的句柄?

  45. LR分析法的基本思想是:在规范归约过程中,一方面记住已移进和归约出的整个符号串,即记住“历史”,另一方面根据所用的产生式推测未来可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于栈顶时,希望能根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶符号串是否构成相对某一产生式的句柄。LR分析法的基本思想是:在规范归约过程中,一方面记住已移进和归约出的整个符号串,即记住“历史”,另一方面根据所用的产生式推测未来可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于栈顶时,希望能根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶符号串是否构成相对某一产生式的句柄。

  46. LR分析法的这种基本思想是很符合哲理的。因而这种分析法也必定是非常通用的。正因如此,实现起来也就非常困难。“历史”材料的积累虽不困难(实际上都保存于分析栈中),但“展望”材料的汇集却是一件很不容易的事情,在实际实现上是非常困难的。根据历史推测未来,即使是推测未来的一个符号,也常常存在许多不同的可能性。因此,当把“历史”和“展望”材料综合在一起时,复杂性就大大增加。如果简化对“展望”资料的要求,我们就可能获得实际可行的分析算法。实际上,实用的LR分析器都是带有一定限制的。LR分析法的这种基本思想是很符合哲理的。因而这种分析法也必定是非常通用的。正因如此,实现起来也就非常困难。“历史”材料的积累虽不困难(实际上都保存于分析栈中),但“展望”材料的汇集却是一件很不容易的事情,在实际实现上是非常困难的。根据历史推测未来,即使是推测未来的一个符号,也常常存在许多不同的可能性。因此,当把“历史”和“展望”材料综合在一起时,复杂性就大大增加。如果简化对“展望”资料的要求,我们就可能获得实际可行的分析算法。实际上,实用的LR分析器都是带有一定限制的。

  47. YACC(Yet Another Compiler-Compiler)是在美国贝尔实验室研制开发的。早期为UNIX操作系统下的一个软件开发工具。目前已经移植到多种操作系统上,并已成功开发了许多编译程序。但严格说它还不是一个编译程序自动产生器,因为它不能产生完整的编译程序。YACC输入用户提供的语言的语法描述规格说明,基于LALR语法分析原理,自动构造一个该语言的语法分析器,同时,它还能根据规格说明中给出的语义子程序建立规定的翻译。

  48. YACC的规格说明(或YACC源程序)由说明部分、翻译规则和辅助过程三部分组成,其形式如下:YACC的规格说明(或YACC源程序)由说明部分、翻译规则和辅助过程三部分组成,其形式如下: 说明部分 %% 翻译规则 %% 辅助过程

More Related