1.56k likes | 1.72k Views
编译原理. 主讲 : 肖秀春 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 是否为某语法成分.
E N D
编译原理 主讲:肖秀春 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是否为某语法成分
4.1 语法分析程序概述 2) 语法分析器的输入 • 输入:语法分析器的输入是语法分析器的输出,即Token序列或者称Token流。
4.1 语法分析程序概述 3) 语法错误类别及关键性错误 a. 程序的开始单词错,表达式的开始单词错,语句的开始单词错,表达式的后继单词错,语句的后继单词错。 b. 标识符和常量单词错。 c. 括号类错误。 d. 分隔符错(最关键性错误)。
4.1 语法分析程序概述 4) 语法错误处理 • 语法错误信息输出 • 语法错误纠正 a. 插入 b. 删除 c. 修改
4.2 上下文无关文法 1) 上下文无关文法的概念(谈谈什么是文法) • 当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。 • 以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则来说明句子的组成结构,比如汉语句子可以描述为: 由主语后接谓语构成,构成谓语的是动词和直接宾语 我们采用BNF来表示这种语言的句子构成规则: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉
4.2 上下文无关文法 1)上下文无关文法的概念(谈谈什么是文法) • 有了一组规则以后,按照如下方式导出句子:开始去规则中找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,那么这个过程一种可能为在页底所示: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉 〈句子〉 〈主语〉〈谓语〉 〈代词〉〈谓语〉我〈谓语〉我〈动词〉〈直接宾语〉我是〈直接宾语〉我是〈名词〉我是大学生 结论:1. 可以为某种语言定义一些规则,运用这些规则进行逐步替换可以得到该语言的句子(不考虑其中的语义)。 2. 文法是一组规则,用以定义语言的语法结构。
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 = φ
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}
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]。 规定上述习惯表示后,文法可以只列出产生式和文法名称。
4.2 上下文无关文法 1)上下文无关文法的概念(续) 例3G[S]: S→aSb A→ab |aAb |ε 例4G[S]: S –> AB A –> Ax | y B –> z 注: 3.A→ε表示空产生式,即:A由空符号串产生。
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 ε
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
4.2 上下文无关文法 1)上下文无关文法的概念(续) • 最左推导和最右推导的概念 最左(最右)推导,最左(最右)归约:在推导的任一步αβ, 都是对α中的最左(右)非终结符进行替换,则称该推导为最左 (最右)推导,其逆过程为最右(最左归约)。 规范推导,规范归约:最右推导被称为规范推导,最左归约称为规范归约。 规范句型:由规范推导所得的句型称为规范句型。 例7:S aABe A Abc | b B d S rm aABe rm aAde rm aAbcde rm abbcde
4.2 上下文无关文法 1)上下文无关文法的概念(句型、句子的定义) • 句型、句子的定义 句型: 有文法G,若S =>*β,则称β是文法G的句型。 • 句子: • 有文法G,若S =>*β,且β∈VT*,则称x是文法G的句子。 例8:G[S]: S→0S1, S→01 S 0S1 00S11 000S11100001111 G的句型S,0S1 ,00S11 ,000S111,00001111 G的句子00001111, 01
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}
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是等价的。
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。
4.2 上下文无关文法 2) 文法的类型(四种文法产生式的形式) 1型文法(上下文有关文法):产生式的形式为α1Aα2→α1βα2,即只有A出现在α1和α2的上下文中时,才允许β取代A。其识别系统是线性界限自动机。 2型文法(上下文无关文法CFG):产生式的形式为A→β,β取代A时与A的上下文无关。其识别系统是不确定的下推自动机。 3型文法(正规文法RG):产生的语言是有穷自动机(FA)所接受的集合
0型文法 1型文法 2型文法 3型文法 4.2 上下文无关文法 2) 文法的类型(四种类型文法包含关系) • 四种文法之间的关系是:包含关系.(原因:将产生式做进一步限制而定义的。)
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
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
4.2 上下文无关文法 2) 文法的类型 • 四种类型文法产生的语言 a. 0型文法产生的语言称为0型语言 b. 1型文法或上下文有关文法( CSG)产生的语言称为1型语 言或上下文有关语言(CSL) c. 2型文法或上下文无关文法( CFG)产生的语言称为2型语 言或上下文无关语言( CF L ) d. 3型文法或正则(正规)文法( RG )产生的语言称为3型语 言正则(正规)语言( RL )
带 a0 a1 a2 a3 a4 a5 a6 a7 a8 … an-1 an 磁头 控制器 4.2 上下文无关文法 2) 文法的类型 • 0型文法和图灵机 0型文法(短语结构文法)的能力相当于图灵机,可以表征任何递归可枚举集,而且任何0型语言都是递归可枚举的 任何能用图灵机描述的计算都能机械实现,任何能在现代计算机上实现的计算都能用图灵机描述
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)
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)=φ
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中
4.2 上下文无关文法 3) 正规语言、正规式与有限自动机的表达能力(续) • 对上的正规式r ,存在一个RG=(VN,VT,P,S):L(G)=L(r) VT=,S VN ,生成正规产生式 Sr (R 1) 对形如 Ar1r2的正规产生式:Ar1B Br2 BVN (R 2)对形如Arr1的正规产生式: ArB Ar1 BrB Br1 BVN (R 3)对形如Ar1r2的正规产生式: Ar1 A r2 不断应用R做变换,直到每个产生式右端至多有一个VN
4.2 上下文无关文法 4)上下文无关文法的语法树 • 上下文无关文法产生式形式为:A β,它表示不管A的前后是 什么,都可以把A用β替换。 • 上下文无关文法有足够的能力描述程序设计语言的语法结构, 所以我们在本章研究上下文无关文法。 • 语法树---句型推导的直观表示
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中的一个产生式 语法树的结果: 从左到右读出语法树叶子的标记而构成的行谓之语法树的结果。
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
4.2 上下文无关文法 4)上下文无关文法的语法树(续) • 语法树的有关结论 给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树)。 若G为上下文无关文法, 对于α≠ε,有S =>*α,当且仅当文法G有以α为结果的一棵语法树(推导树)。
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 SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa 最左(右)推导: 一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。
4.2 上下文无关文法 5)二义文法二义文法的定义 • 二义文法的定义 a. 若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。 b. 或者,若一个文法存在某个句子有两个不同的最左(右)推 导,则称这个文法是二义的。
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 * EEE + E id * E E * E +E id * E + E id * E + E id * id + E id * id + E id * id + id id * id + id
4.2 上下文无关文法 5)二义文法(二义文法的相关结论) • 二义文法的相关结论 判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题都是递归不可解的,但可以为无二义性寻找一组充分条件。 • 文法的二义性和语言的二义性是不同的概念 可能有两个不同的文法G和G′,这两个文法所产生的语言是相 同的,但G为二义的,而G ′是无二义的。
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) 规定优先顺序和结合律 • 如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。对于一个程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。
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}
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}
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,#}
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}
4.2 上下文无关文法 7)语法分析方法(概述) • 语法分析的含义 识别一个符号串是否为某文法的句型,是语法树的构造过程。 • 从左到右的分析算法:即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号,直到分析结束。 例20:文法G:S → cAd A → ab A → a识别输入串w=cabd是否为该文法的句子
4.2 上下文无关文法 7)语法分析方法(分类) • 分析算法分类 自顶向下分析法:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。 自底向上分析法:从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。
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
要点: 由根向下构造语法树 构造最左推导 推导出的终结符是否与当前输入符 匹配 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)语法分析方法(自顶向下分析方法要点)
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是否该文法的句子
4.2 上下文无关文法 7)语法分析方法(可能遇到的问题) • 两种方法反映了两种语法树的构造过程 自顶而下方法是从文法符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串。 自底而上方法则是从输入符号串开始,以它做为语法树的结果,自底向上地构造语法树。
S c A d a 4.2 上下文无关文法 7)语法分析方法(续) • 自顶向下的分析方法可能遇到的问题 若S cAd 后选择(3),则得到S cAd cad 那将会? w的第二个符号可以与叶子结点a得以匹配,但第三个符号却不能与下一叶子结点d匹配 ?宣告分析失败(其意味着,识别程序不能为串cad构造语法树,即cad不是句子) -显然是错误的结论。 导致失败的原因是在分析中对A的选择不是正确的。