1 / 156

编译原理

编译原理. 主讲 : 肖秀春 E-Mail: xiaoxxc@sohu.com. 第四章 文法与语法分析. 4.1 语法分析程序概述. 4.2 上下文无关文法. 4.3 递归下降法-自顶向下分析. 4.4 LL 分析方法-自顶向下分析. 4.5 LR 方法-自底向上分析. 4.6 LR 分析分析器的生成器. 4.7 语法错误处理. 本章主要内容 (Chapter 4). 4.1 语法分析程序概述. 1 ) 语法分析器的功能. 基本功能:根据文法规则,从源程序单词符号串中识别出语法成分,并进行语法检查。. 基本任务:识别符号串 S 是否为某语法成分.

urit
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. 编译原理 主讲:肖秀春 E-Mail: xiaoxxc@sohu.com

  2. 第四章 文法与语法分析

  3. 4.1 语法分析程序概述 4.2 上下文无关文法 4.3 递归下降法-自顶向下分析 4.4 LL分析方法-自顶向下分析 4.5 LR方法-自底向上分析 4.6 LR分析分析器的生成器 4.7 语法错误处理 本章主要内容(Chapter 4)

  4. 4.1 语法分析程序概述 1) 语法分析器的功能 • 基本功能:根据文法规则,从源程序单词符号串中识别出语法成分,并进行语法检查。 • 基本任务:识别符号串S是否为某语法成分

  5. 4.1 语法分析程序概述 2) 语法分析器的输入 •  输入:语法分析器的输入是语法分析器的输出,即Token序列或者称Token流。

  6. 4.1 语法分析程序概述 3) 语法错误类别及关键性错误 a. 程序的开始单词错,表达式的开始单词错,语句的开始单词错,表达式的后继单词错,语句的后继单词错。 b. 标识符和常量单词错。 c. 括号类错误。 d. 分隔符错(最关键性错误)。

  7. 4.1 语法分析程序概述 4) 语法错误处理 •  语法错误信息输出 •  语法错误纠正 a. 插入 b. 删除 c. 修改

  8. 4.2 上下文无关文法 1) 上下文无关文法的概念(谈谈什么是文法) •  当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。 •  以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则来说明句子的组成结构,比如汉语句子可以描述为: 由主语后接谓语构成,构成谓语的是动词和直接宾语 我们采用BNF来表示这种语言的句子构成规则: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉

  9. 4.2 上下文无关文法 1)上下文无关文法的概念(谈谈什么是文法) •  有了一组规则以后,按照如下方式导出句子:开始去规则中找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,那么这个过程一种可能为在页底所示: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉 〈句子〉  〈主语〉〈谓语〉 〈代词〉〈谓语〉我〈谓语〉我〈动词〉〈直接宾语〉我是〈直接宾语〉我是〈名词〉我是大学生 结论:1. 可以为某种语言定义一些规则,运用这些规则进行逐步替换可以得到该语言的句子(不考虑其中的语义)。 2. 文法是一组规则,用以定义语言的语法结构。

  10. 4.2 上下文无关文法 1)上下文无关文法的概念(续) • 我们可以采用上下文无关文法来定义语言规则(类似上述BNF) • 上下文无关文法G定义为四元组(VN,VT,P,S ) 其中: VN为非终结符号(或语法实体,或变量)集; VT为终结符号集; P为产生式(也称规则)的集合; 具有如下形式: A →X1X2…Xn ,A为VN,Xi为(VN∪ VT) 。 S称作识别符号或开始符号,它是一个非终结符,至少要在一条产生式中作为左部出现。 VN和VT不含公共的元素,即VN∩ VT = φ

  11. 4.2 上下文无关文法 1)上下文无关文法的概念(续) 例1 上下文无关文法G=(VN,VT,P,S), VN = { S }, VT ={ 0, 1 }, P={S→0S1, S→01 }, S为开始符号 注: 1. 产生式左部相同时可以用或运算符“|”进行合并:   如:S→α, S→β, S→ γ   可以写作S → α | β|γ 例1中的P可以写成如下形式: P={ S→0S1|01}

  12. 4.2 上下文无关文法 1)上下文无关文法的概念(续) 例2 文法G=(VN,VT,P,S) VN ={I,T,D} VT ={a,b,c,…x,y,z,A,B,C…,X,Y,Z,0,1,…,9} P={I→T| IT |ID, T→a|b…|z|A|B…|Z, D→0…9, } S=I为开始符号。 注: 2. 习惯表示: 大写字母:非终结符   小写字母:终结符 开始符号和文法的名字可写在一起:如G[S]。 规定上述习惯表示后,文法可以只列出产生式和文法名称。

  13. 4.2 上下文无关文法 1)上下文无关文法的概念(续) 例3G[S]: S→aSb A→ab |aAb |ε 例4G[S]: S –> AB A –> Ax | y B –> z 注: 3.A→ε表示空产生式,即:A由空符号串产生。

  14. 4.2 上下文无关文法 1) 上下文无关文法的概念(续) • 直接推导的定义 如果A→β是文法G的产生式, 则有αAγ  αβγ。 上述过程是:把串αAγ 中的非终极符用该非终极符产生式的右部替换得到新的串αβγ。 我们称上述过程为一次直接推导,其逆过程为一次直接归约。 读作αAγ 直接推导到αβγ,也称αβγ直接归约到αAγ。 例5:G[S]: S→0S1, S→01 0S1 00S11 00S11 000S111 000S111 00001111 S 0S1,这一步可理解为: εS ε ε0S1 ε

  15. 4.2 上下文无关文法 1)上下文无关文法的概念(续) • 多步推导的定义 若存在v w0 w1 ... wn=w(n>0) 则记为v =>+ w,v推导出w,或w归约到v。 若有v =>+ w,或v=w,则记为v =>* w,称为任意步推导,简称推导,其逆过程为任意步归约,简称归约到。 例6:G[S]:S→0S1, S→01 S 0S1 00S11 000S111 00001111 S =>+ 00001111 S =>* S 00S11 =>* 00S11

  16. 4.2 上下文无关文法 1)上下文无关文法的概念(续) • 最左推导和最右推导的概念 最左(最右)推导,最左(最右)归约:在推导的任一步αβ, 都是对α中的最左(右)非终结符进行替换,则称该推导为最左 (最右)推导,其逆过程为最右(最左归约)。 规范推导,规范归约:最右推导被称为规范推导,最左归约称为规范归约。 规范句型:由规范推导所得的句型称为规范句型。 例7:S  aABe A  Abc | b B  d S rm aABe rm aAde rm aAbcde rm abbcde

  17. 4.2 上下文无关文法 1)上下文无关文法的概念(句型、句子的定义) • 句型、句子的定义 句型: 有文法G,若S =>*β,则称β是文法G的句型。 • 句子: •   有文法G,若S =>*β,且β∈VT*,则称x是文法G的句子。 例8:G[S]: S→0S1, S→01 S 0S1 00S11 000S11100001111 G的句型S,0S1 ,00S11 ,000S111,00001111 G的句子00001111, 01

  18. 4.2 上下文无关文法 1)上下文无关文法的概念(文法生成的语言) • 文法生成的语言 由文法G生成的语言记为L(G),它是文法G的一切句子的集合: L(G)={x|S =>* x,其中S为文法的开始符号,且x ∈VT*} 例9:G[S]: S→0S1, S→01 L(G)={0n1n|n≥1}

  19. 4.2 上下文无关文法 1)上下文无关文法的概念(文法的等价) • 文法的等价 若L(G1)=L(G2),则称文法G1和G2是等价的。 例10 如文法 G1[A]:A→0R A→01 R→A1 G2[S]:S→0S1 S→01 G1和G2表达的语言是相同的,所以有G1与G2是等价的。

  20. 4.2 上下文无关文法 2) 文法的类型 • 四种类型的定义 对产生式施加不同的限制,Chomsky将文法分为四种类型: • 0型文法:对任一产生式α→β,都有α∈(VN∪VT)+, β∈(VN∪VT)*。 • 1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 S→ε除外。 • 2型文法:对任一产生式α→β,都有α∈VN,β∈(VN∪VT)* 3型文法:任一产生式α→β的形式都为A→aB或A→a,其中A∈VN,B∈VN,a∈VT。

  21. 4.2 上下文无关文法 2) 文法的类型(四种文法产生式的形式) 1型文法(上下文有关文法):产生式的形式为α1Aα2→α1βα2,即只有A出现在α1和α2的上下文中时,才允许β取代A。其识别系统是线性界限自动机。 2型文法(上下文无关文法CFG):产生式的形式为A→β,β取代A时与A的上下文无关。其识别系统是不确定的下推自动机。 3型文法(正规文法RG):产生的语言是有穷自动机(FA)所接受的集合

  22. 0型文法 1型文法 2型文法 3型文法 4.2 上下文无关文法 2) 文法的类型(四种类型文法包含关系) •  四种文法之间的关系是:包含关系.(原因:将产生式做进一步限制而定义的。)

  23. 4.2 上下文无关文法 2) 文法的类型 • 1型文法举例 例11:1型(上下文有关)文法 文法G[S]: S→CD Ab→bA C→aCA Ba→aB C→bCB Bb→bB AD→aD C→ε BD→bD D→ε Aa→bD

  24. 4.2 上下文无关文法 2) 文法的类型 • 2型和3型文法举例 例11:2型(上下文无关)文法 文法G[S]: S→B A→AB|0 B→0BA|1 例12:3型(正则(或正规))文法 文法G[S]:S→0A|1B|0 A→0A|1B|0S B→1B|1|0

  25. 4.2 上下文无关文法 2) 文法的类型 • 四种类型文法产生的语言 a. 0型文法产生的语言称为0型语言 b. 1型文法或上下文有关文法( CSG)产生的语言称为1型语 言或上下文有关语言(CSL) c. 2型文法或上下文无关文法( CFG)产生的语言称为2型语 言或上下文无关语言( CF L ) d. 3型文法或正则(正规)文法( RG )产生的语言称为3型语 言正则(正规)语言( RL )

  26. 带 a0 a1 a2 a3 a4 a5 a6 a7 a8 … an-1 an 磁头 控制器 4.2 上下文无关文法 2) 文法的类型 • 0型文法和图灵机 0型文法(短语结构文法)的能力相当于图灵机,可以表征任何递归可枚举集,而且任何0型语言都是递归可枚举的 任何能用图灵机描述的计算都能机械实现,任何能在现代计算机上实现的计算都能用图灵机描述

  27. 4.2 上下文无关文法 3) 正规语言、正规式与有限自动机的表达能力 • 正规语言、正规式与有限自动机FA的表达能力是相同的。 即: a. 如果存在一个正规语言、其表达的语言为L(G),则一定存在表达能力相同的正规式和有限自动机FA。 且L(G)=L(r)=L(M) b. 如果存在一个正规式、其表达的语言为L(r),则一定存在表达能力相同的正规语言和有限自动机FA。 且L(G)=L(r)=L(M) c. 如果存在一个有限自动机、其表达的语言为L(M),则一定存在表达能力相同的正规语言和正规式。 且L(G)=L(r)=L(M)

  28. 4.2 上下文无关文法 3) 正规语言、正规式与有限自动机的表达能力(续) • 设G=(VN,VT,P,S)是正规文法,则存在一个有穷自动机 M=(K, ∑ , f, A, Z),使得L(M)=L(G) 有穷自动机NFA M 这样构造: · ∑= VT · K= VN ∪{N}, N为一个新状态,它不在VN中 · A=S · Z={N} · 对G中的形如 D→tB的产生式,t为终结符或ε,有f(D,t)=B; 对G中形如D→t的产生式, t为终结符或ε,有f(D,t)=N; 对VT中的每一个a ,有f(N,a)=φ

  29. 4.2 上下文无关文法 3) 正规语言、正规式与有限自动机的表达能力(续) • 已知一有穷自动机M= (K, ∑ , f, A, Z),存在有一个3型文法G = (VN,VT,P,S),使得L(G)=L(M) G 的构造: · VT =∑ · VN= K · S = A ·若 f(D,t)=B ,则D→tB在P中 若 f(D,t)=B ,且B在Z中,则D→t在P中

  30. 4.2 上下文无关文法 3) 正规语言、正规式与有限自动机的表达能力(续) • 对上的正规式r ,存在一个RG=(VN,VT,P,S):L(G)=L(r) VT=,S  VN ,生成正规产生式 Sr (R 1) 对形如 Ar1r2的正规产生式:Ar1B Br2 BVN (R 2)对形如Arr1的正规产生式: ArB Ar1 BrB Br1 BVN (R 3)对形如Ar1r2的正规产生式: Ar1 A r2 不断应用R做变换,直到每个产生式右端至多有一个VN

  31. 4.2 上下文无关文法 4)上下文无关文法的语法树 • 上下文无关文法产生式形式为:A β,它表示不管A的前后是   什么,都可以把A用β替换。 • 上下文无关文法有足够的能力描述程序设计语言的语法结构,   所以我们在本章研究上下文无关文法。 • 语法树---句型推导的直观表示

  32. 4.2 上下文无关文法 4)上下文无关文法的语法树(续) • 语法树的定义 设G=( VN,VT,P,S)为一cfg,若一棵树满足下列4个条件,则此树称作G的语法树(推导树)(派生树): 1. 每个结点都有一个标记,此标记是V的一个符号 2. 根的标记是S 3. 若一结点n至少有一个它自己除外的子孙,并且有标记A,则肯定A∈VN 4. 如果结点n有标记A,其直接子孙结点从左到右的次序是n1,n2,…,nk,其标记分别为A1,A2,…,Ak,那么A→A1A2…Ak一定是P中的一个产生式 语法树的结果: 从左到右读出语法树叶子的标记而构成的行谓之语法树的结果。

  33. S a A S S b A a aba 4.2 上下文无关文法 4)上下文无关文法的语法树(续) • 语法树的例子 例13: G[S]: S→aAS A→SbA A→SS S→a A→ba 句子aabbaa的语法树(推导树) 句子aabbaa推导过程: S aAS  aSbAS  aabAS aabbaS aabbaa

  34. 4.2 上下文无关文法 4)上下文无关文法的语法树(续) • 语法树的有关结论 给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树)。 若G为上下文无关文法, 对于α≠ε,有S =>*α,当且仅当文法G有以α为结果的一棵语法树(推导树)。

  35. S a A S S b A a ab a 4.2 上下文无关文法 4)上下文无关文法的语法树(续) • 推导过程中施用产生式的顺序 例14: G[S]: S→aAS A→SbA A→SS S→a A→ba SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa 最左(右)推导: 一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。

  36. 4.2 上下文无关文法 5)二义文法二义文法的定义 •  二义文法的定义 a. 若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。 b. 或者,若一个文法存在某个句子有两个不同的最左(右)推 导,则称这个文法是二义的。

  37. E E E E E + E * E E E E + * id id id id id id 4.2 上下文无关文法 5)二义文法(二义文法的例子) •  二义文法的例子 例15G[E]:E  E + E | E * E | (E ) |  E | id E E * EEE + E  id * E E * E +E  id * E + E  id * E + E  id * id + E  id * id + E  id * id + id  id * id + id

  38. 4.2 上下文无关文法 5)二义文法(二义文法的相关结论) •  二义文法的相关结论 判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题都是递归不可解的,但可以为无二义性寻找一组充分条件。 •  文法的二义性和语言的二义性是不同的概念 可能有两个不同的文法G和G′,这两个文法所产生的语言是相 同的,但G为二义的,而G ′是无二义的。

  39. 4.2 上下文无关文法 5)二义文法(二义文法改造为无二义文法) •  二义文法改造为无二义文法 G[E]: E → i G[E]:E → T|E+T E → E+E T → F|T*F E → E*E F → (E)|i E → (E) 规定优先顺序和结合律 • 如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。对于一个程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。

  40. 4.2 上下文无关文法 6)文法分析算法 •  确定可推导出空串的非终极符 问题:哪些非终极符可以推导出空串?A → + ε 1)  令S_Lambda={Aj|Aj → ε }; • 对每个产生式p:Ap → X1…Xn,若X1…Xn ∈S_Lambda, •   则Ap并入S_Lambda; • 重复第2)步,直到S_Lambda收敛,此时的S_Lambda即为可推导出空串的非终极符集。 例16:文法G[S]:S→Aa|bB|c A→Aa|bB| ε B→AB|b|c S_Lambda={A,S,B}

  41. 4.2 上下文无关文法 6)文法分析算法(续) • First集 First(β)={a ∈ VT| β *a…} (if β* ε then {ε} else  ) 注:β表示符号串,可以为非终极符和终极符组成的任意串,即 β ∈(VN  VT)*,结果为终极符集。 例17:文法G[S]:S→aA|Bb|c A→Aa|bB| ε|B B→aB|b|c First(S)={a, c, b}, First(A)={b,ε,a,c},First(B)={a,b,c}

  42. 4.2 上下文无关文法 6)文法分析算法(续) • Follow集 Follow(A)={a ∈ VT|S *…Aa…} (if S*…A then {#} else  ) 注:A为非终极符,即A ∈VN ,结果为终极符集。 例18:文法G[S]:S→aA|Bb|c A→Aa|bB| ε|B B→aB|b|c Follow(A)={#,a}, Follow(B)={b,#}

  43. 4.2 上下文无关文法 6)文法分析算法(续) • Predict集 Predict(A → β )=First(β) ,当First(β)不含ε时 First(β)-{ε} Follow(A),当First(β)包含ε时 注:A → β为产生式,结果为终极符集。 例19:文法G[S]:S→aA|Bb|c A→Aa|bB| ε|B B→aB|b|c Predict(B→aB)={a}, 因为First(aB)={a} Predict(A→Aa)={#, b,a,c}, 因为First(Aa )={b,ε,a,c}, Follow(A)={#,a}

  44. 4.2 上下文无关文法 7)语法分析方法(概述) •  语法分析的含义 识别一个符号串是否为某文法的句型,是语法树的构造过程。 • 从左到右的分析算法:即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号,直到分析结束。 例20:文法G:S → cAd A → ab A → a识别输入串w=cabd是否为该文法的句子

  45. 4.2 上下文无关文法 7)语法分析方法(分类) •  分析算法分类 自顶向下分析法:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。 自底向上分析法:从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。

  46. S S S c A dc A d ab 4.2 上下文无关文法 7)语法分析方法(自顶向下分析方法) •  自顶向下的分析方法语法树的构造过程 例21:文法G:S → cAd A → ab A → a识别输入串w=cabd是否为该文法的句子 推导过程:S  cAd cAd  cabd

  47. 要点: 由根向下构造语法树 构造最左推导 推导出的终结符是否与当前输入符 匹配 S –> AB A –> aA |  B –> b | bB aaab. S AB S –> AB aAB A –> aA aaAB A –> aA aaaAB A –> aA aaa  B A –>  aaab B –> b S aaab A B a A b a A a 4.2 上下文无关文法 7)语法分析方法(自顶向下分析方法要点)

  48. S AA c a b dc ab dc abd 归约过程构造的推导: cAd cabd S  cAd 4.2 上下文无关文法 7)语法分析方法(自底向上分析方法) •  自底向上的分析方法语法树的构造过程 例22:文法G: S → cAd A → ab A → a识别输入串w=cabd是否该文法的句子

  49. 4.2 上下文无关文法 7)语法分析方法(可能遇到的问题) •  两种方法反映了两种语法树的构造过程 自顶而下方法是从文法符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串。 自底而上方法则是从输入符号串开始,以它做为语法树的结果,自底向上地构造语法树。

  50. S c A d a 4.2 上下文无关文法 7)语法分析方法(续) •  自顶向下的分析方法可能遇到的问题 若S  cAd 后选择(3),则得到S  cAd  cad 那将会? w的第二个符号可以与叶子结点a得以匹配,但第三个符号却不能与下一叶子结点d匹配 ?宣告分析失败(其意味着,识别程序不能为串cad构造语法树,即cad不是句子) -显然是错误的结论。 导致失败的原因是在分析中对A的选择不是正确的。

More Related