540 likes | 754 Views
编译原理 第三章. 文法和语言. 一个程序设计语言,它的完整定义应包括 语法和语义 两 个部分。. 语法是指一组规则,用它可以形成和产生一个合适的程序。. 语义分 静态语义和动态语义. 静态语义是一系列的限定规则,并确定哪些合乎语法 的程序是合法的。. 动态语义也称运行语义或执行语义,表明程序要做什 么,执行什么?. 文法 是阐明语法的工具。. 3.1 文法的直观概念. 自然语言的例子: 对于“我是大学生”类似的句子有以下语法规则. < 句子 >::=< 主语 >< 谓语 > < 主语 >::=< 代词 >|< 名词 >
E N D
编译原理 第三章 文法和语言
一个程序设计语言,它的完整定义应包括语法和语义两一个程序设计语言,它的完整定义应包括语法和语义两 个部分。 语法是指一组规则,用它可以形成和产生一个合适的程序。 语义分静态语义和动态语义 静态语义是一系列的限定规则,并确定哪些合乎语法 的程序是合法的。 动态语义也称运行语义或执行语义,表明程序要做什 么,执行什么? 文法是阐明语法的工具。
3.1 文法的直观概念 自然语言的例子: 对于“我是大学生”类似的句子有以下语法规则 <句子>::=<主语><谓语> <主语>::=<代词>|<名词> <代词>::=我 | 你 | 他 <名词>::=王明 | 大学生 | 英语 <谓语>::=<动词><直接宾语> <动词>::=是 | 学习 <直接宾语>::=<代词>|<名词>
“我是大学生”的推导过程 <句子> => <主语><谓语> => <代词><谓语> => 我 <谓语> =>我 <动词><直接宾语> =>我 是 <直接宾语> =>我 是 <名词> =>我 是 大学生 <句子>::=<主语><谓语> <主语>::=<代词>|<名词> <代词>::=我 | 你 | 他 <名词>::=王明 | 大学生 | 英语 <谓语>::=<动词><直接宾语> <动词>::=是 | 学习 <直接宾语>::=<代词>|<名词>
符号 => 是指使用一条规则,代替=>左边的某个符号, 产生右端的符号串 显然,按上述方法,还可以推导出其它很多句子 如: 王明是大学生 王明学习英语 我学习英语 他学习英语 你学习王明 你是工人 只要将语法进行一定的改造,它能识别一些自然语言。
3.2 符号和符号串 • 字母表:是元素的非空有穷集合。 我们把字母表中的元素称为符号,因此字 母表也称为符号集。
符号串:由字母表中的符号组成的任何有穷序列称为符符号串:由字母表中的符号组成的任何有穷序列称为符 号串。 在符号串中,符号是有序的,如ab和ba不相等。abca和aabc 不相等。
符号串的表示 (1)如果符号串x中有m个符号,则称其长度为m。 表示为|x|=m。 (2)允许空符号串,即不包含任何符号的符号串。 用ε表示,其长度为0,即|ε |=0。
符号串的头、尾、固有头和固有尾 如果z=xy是一符号串,则x是z的头,y是z的尾。 如果x是非空的,那么y是固有尾;如果y是非空的,那么 x是固有头。
书写方式说明 当我们对符号z=xy的头感兴趣而对其余部分不感兴趣 时,我们可以采用省略写法:z=x…; 如果只是为了强调x在符号串z中的某处出现,则可表 示为:z=…x…; 符号t是符号串z的最后一个符号,则可表示为:z=…t。
符号串的连接:设x和y是符号串,它们的连接xy是把y的符符号串的连接:设x和y是符号串,它们的连接xy是把y的符 号写在x的符号之后,得到的符号串。 如:x=ST,y=abu,则xy=STabu.。 显然:εx=xε =x 符号串的方幂:设x是符号串,把x自身连接n次得到的符号 串z,即:z=xx…xx,称为符号串x的方幂,写作:z=xn, 对x的方幂表示为:x0= ε, x1=x, x2=xx, x3=xxx 对AB的方幂表示为: (AB)0= є, (AB)1=AB, (AB)2=ABAB
符号串集合:若集合A中的一切元素是某字母表中的符号符号串集合:若集合A中的一切元素是某字母表中的符号 串,则称A为该字母表上的符号串集合。 符号串集合的乘积:两个符号串集合A和B的乘积定义为: AB={xy|x∈A且y ∈B},即AB是满足x属于A,y属于B的所 有符号串xy所组成的集合。 如A={a,b},B={c,d},则AB={ac,ad,bc,bd}. 因为对任意符号串x有εx=x ε=x,所以有{ε}A=A {ε} =A
指定字母表∑之后,可用∑*表示∑上的所有有穷长的串指定字母表∑之后,可用∑*表示∑上的所有有穷长的串 的集合。 如:∑={0,1},则∑ *={ε,0,1,11,01,10,000,001…} 也可表示为字母表的方幂方式: ∑ *= ∑0∪ ∑1 ∪ ∑2 ∪ ∑n … ∑+ =∑1 ∪ ∑2 ∪ ∑n … ∑*称为集合的闭包,∑ +称为集合的正闭包。 ∑*= ∑0∪ ∑+ ∑ + =∑ ∑*= ∑* ∑ 若x是∑*的元素,则表示为x∈∑*,否则 x∈∑*
3.3 文法和语言的形式定义 规则,也称重写规则、产生式或生成式是形如: α→β或α::=β的(α,β)有序对,其中α是某字母表V的正闭 包V+中的一个符号,β是某字母表V的闭包V*中的一 个符号。 α称为规则的左部,β称为规则的右部。
定义3.1 文法G定义为四元组(VN,VT,P,S) 其中: VN为非终结符号(或语法实体,或变量)集; VT为终结符号集; P为产生式(也称规则)的集合。 S称作识别符号或开始符号,它是一个非终结符, 至少要在一条规则中作为左部出现。 VN和VT不含公共的元素,即VN∩VT=Φ 例3.1:文法G= (VN,VT,P,S),其中VN ={S}, VT ={0,1}, P={S→0S1,S →01}。
例3.2 文法G= (VN,VT,P,S) 其中:VN={标识符,字母,数字} VT={a,b,c,…,x,y,z,0,1,…9} p={<标识符>→<字母> <标识符> →<标识符><字母> <标识符> →<标识符><数字> <字母> →a <字母> →b … <字母> →z <数字> →0 … <数字> →9} S=<标识符>
很多时候,不用将文法G的四无组显式地表示出来,很多时候,不用将文法G的四无组显式地表示出来, 而只将产生式写出。一般约定,第一条产生式的左 部是识别符号;用<>括起来的是非终结符,不用<> 括起来的是终结符,或者用大写字母表示非终结符, 用小写字母表示终结符。 另一种表示方法: 将G写成G[S],其中S是识别符号。 如例3.1写成: G:S→0S1 S →01
推导的概念 (1) 直接推导 A =>b (2) 长度为n(n≥1)的推导 A=+>b (3)长度为n(n≥0)的推导 A=*>b
定义3.2 如果α→β是文法G=(VN,VT,P,S)的规则(或者说是P 中的一个产生式),γ和δ是V*中的任意符号,若有符号 串v,w满足: v= γ α δ, w= γ β δ 则说v(应用规则α→β)直接产生w,或者说w是v的直接推导 或说w直接归约到v,记作 v=>w 例3.1的文法G: v=0S1,w=0011,直接推导:0S1=>0011,使用规则: S01,这里γ =0,δ=1。 v=S,w=0S1,直接推导:S=>0S1,使用规则: S0S1,这里γ =ε,δ=ε。 v=0S1,w=00S11,直接推导:S=>0S1,使用规则: S0S1,这里γ =0,δ=1。
对于3.2的文法G 例3.2 文法G= (VN,VT,P,S) 其中:VN={标识符,字母,数字} VT={a,b,c,…,x,y,z,0,1,…9} p={<标识符>→<字母> <标识符> →<标识符><字母> <标识符> →<标识符><数字> <字母> →a <字母> →b … <字母> →z <数字> →0 … <数字> →9} S=<标识符> V=<标识符>,w=<标识符><字母> 直接推导出<标识符>=><标识符><字母> 使用的规则是<标识符> →<标识符><字母> 其中γ =ε,δ=ε
定义3.3 如果存在直接推导的序列: v=>w0=>w1…=>wn=>w 则称v推导出(产生)w,其中推导长度为n,或称w归约到v。 记为v=+>w 定义3.4 若v=+>w,或v=>w,则记为v=*>w 如对于例3.1,有直接推导序列v=0S1=>00S11=>000S111 =>00001111=w,即有0S1=+>00001111,也有0S1=*>00001111 对于例3.2的文法,有直接推导序列:v=<标识符>=> <标识符><数字>=><字母><数字>=>x<数字>=>x1=w 即有<标识符>=+>x1,也有<标识符>=*>x1
定义3.5 设G[S]是一文法,如果符号串x是从识别符号推导出来 的,即有S=*>x,则称x是文法G[S]的句型。 若x仅由终结符号组成,即S=*>x,x ∈VT*,则称x为 G[S]的句子。 如:S,0S1,0011都是例3.1文法G的句型。其中0011 还是G的句子。 对于例3.2的文法G,<标识符><字母>、<字母><数字>、 a1,xx9都是文法G的句型,a1,xx9 还是G的句子。
定义3.6 文法G所产生的语言定义为集合{x|S=*>x,其中S为文法 识别符号,且x∈VT*}。 可用L(G)表示该集合。 求例3.1的语言: 对于例3.1 ,它有两条产生式样 (1)S0S1,(2)S01 通过对第一个产生式用n-1次,再用第二个产生式一次, 最后能得出:S=>0S1=>00S11…=>0n-1 S1n-1 =>0n1n 由此可知,其语言集为0n1n 同样,对于例 3.2可以推出其语言集为字母打头字母数字串
例3.3 设文法G=(VN,VT,P,S), VN ={S,B,E}, VT ={a,b,c},P中包括 以下产生式: (1) SaSBE (2) SaBE (3) EBBE (4) aBab (5) bBbb (6) bEbe (7) eEee 推导过程: (1)使用n-1次2式后,会有n个a,n 个(BE) an(BE)n (2)使用n次3式后,可以将n个(BE)化为n个B和n个E 即anBnEn (3)使用一次4式得到 anbBn-1En (4)使用n-1次5式得到anbnEn (5)使用一次6式得到anbn-1eEn-1 (6)使用n-1次7式得到anbnen
定义3.7 若L(G1)=L(G2),则称文法G1和G2是等价的。 如文法:G[A]: 其中:A0R A01 RA1 与例3.1文法等价。
3.4 文法的类型 • 0型文法(短语文法) • 1型文法(上下文有关文法) • 2型文法(上下文无关文法) • 3型文法(正规文法)
0型文法(短语文法) G= (VN,VT,P,S),如果它的每一个产生式αβ是这样一种结 构, α∈(VN∪VT)*,且至少含有一个非终结符,而 β ∈(VN∪VT)*,则G是一个0型文法(短语文法)。 一个非常重要的理论结果是,0型文法的能力相当于图灵 机。或者说,任何0型语语言都是递归可枚举的;反之, 递归可枚举集必定是一个0型语言。
1型文法(上下文有关文法) 设G= (VN,VT,P,S),若P中的每一个产生式αβ,均满足 |β|≥|α|,仅仅Sε除外,则G是一个1型文法(上下文有关 文法)。 例3.3 设文法G=(VN,VT,P,S), VN ={S,B,E}, VT ={a,b,c},P中包括 以下产生式: (1) SaSBE (2) SaBE (3) EBBE (4) aBab (5) bBbb (6) bEbe (7) eEee 例3.1:文法G= (VN,VT,P,S),其中VN ={S}, VT ={0,1}, P={S→0S1,S →01}。
2型文法(上下文无关文法) 设G= (VN,VT,P,S),若P中的每一个产生式αβ满足: α是一个非终结符,β ∈(VN∪VT)*,则此文法称为 2型文法(上下文无关文法) 例3.1:文法G= (VN,VT,P,S),其中VN ={S}, VT ={0,1}, P={S→0S1,S →01}。
例3.2 文法G= (VN,VT,P,S) 其中:VN={标识符,字母,数字} VT={a,b,c,…,x,y,z,0,1,…9} p={<标识符>→<字母> <标识符> →<标识符><字母> <标识符> →<标识符><数字> <字母> →a <字母> →b … <字母> →z <数字> →0 … <数字> →9} S=<标识符>
例3.4 G=({S,A,B},{a,b},P,S) 其中P由下列产生式组成: SaB AbAA SbA Bb Aa BbS AaS BaSS 有时,为书写方便,常把同一左部的产生式写在一起 如: Aα1Aα2 …… Aαn 写成Aα1|α2 …|αn 上面的产生式可写成: SaB|bA Aa|aS|bAA B->b|bS|aBB
3型文法(正规文法) 设G= (VN,VT,P,S),若P中的每个产生式的形式都是 AaB或Aa,其中A和B都是非终结符,a是终结符, 则G是3型文法或正规文法。 例3.5 文法G=({S,A,B},{0,1},P,S),其中P 是由下列产生式组成: S0A A1B S1B B1B S0 B1 A0A B0 A0S
每一种正规文法都是上下文无关的。 每一种上下文无关文法都是上下文有关的。 每一种上下文有关文法都是短语文法。
3.6 上下文无关文法及其语法树 例3.6 文法G=({E},{+,*,i,(,)},P,E) 其中P为: Ei EE+E EE*E E(E) 描述一种简单赋值语句的产生式为: <赋值语句>i:=E 条件语句语法: <条件语句>if<条件>then<语句>| if<条件>then<语句>else<语句>
语法树 • 给定文法G= (VN,VT,P,S),对于G的任何句型都能构造 • 与之关联的语法树(推导树)。这棵树满足下列四个条件: • 每个结点都有一个标记,此标记是V的一个符号。 • 根的标记是S。 • 若一结点n至少有一个它自己除外的子孙,并且标有A, • 则A一定在VN中。 • 如果n的直接子孙,从左到右的次序是n1,n2…nk,其标 • 记分别是A1,A2,…Ak,则AA1A2…Ak一定是P中的一个 • 产生式。
例3.7 G=({S,A},{a , b}, P, S} 其中P为: (1) SaAS (2) ASbA (3) ASS (4) SA (5) Aba 对于aabbaa的推导,构造语法树如下: S a S A a A S b a b a
常把aabbaa叫做语法推导树的结果,把推导树叫做常把aabbaa叫做语法推导树的结果,把推导树叫做 aabbaa句型的语法树。 语法树表示了在推导过程中施用了哪个产生式和施用在 哪个非终结符上,并没有表明施用产生式的顺序。
S a A S A a A S b a b a 也就是说其推导过程并不是唯一的。 如例3.7有: 推导过程1:S=>aAS=>aAa=>aSbAa=>aSbbaa=>aabbaa 推导过程2:S=>aAS=>aSbAS=>aabAS=>aabbaS=>aabbaa 推导过程3:S=>aAS=>aSbAS=>asbAa=>aabAa=>aabbaa
如果在推导的任何一步α=>β,其中α、β是句型,都是对如果在推导的任何一步α=>β,其中α、β是句型,都是对 Α的最左推导,则称这种推导为最左推导。 如果在推导的任何一步α=>β,其中α、β是句型,都是对 Α的最右推导,则称这种推导为最右推导。 在形式语言中,最右推导常被称为规范推导。由规范推 导所得的句型称为规范句型。
例3.6 文法G=({E},{+,*,i,(,)},P,E) 其中P为: Ei EE+E EE*E E(E) 对于句型:i*i+i 其语法树可有两种: E E E + E E * E E E E E * + i i i i
对应的推导过程为: 推导1: E=>E+E=>E*E+E =>i*E+E=>i*i+E=>i*i+i 推导2:E=>E*E=>i*E =>i*E+E=>i*i+E=>i*i+i
如果一个文法存在某个句子对应两个不同的语法树,则如果一个文法存在某个句子对应两个不同的语法树,则 说这个文法是二义的。 例3.6文法G是二义的。 文法的二义性和语言的二义性是两个不同的概念。 可能有两个不同的文法G、G’,其中G是二义的,但 却有L(G)=L(G‘) 要判断任给的一个上下文无关文法是否为二义的,或 它是否产生一个先天二义的上下文无关语言,这两个 问题是递归不可解的。
例3.8 定义表达式的无二义文法G[E] ET|E+T TF|T*F F(E)|i
3.6 句型分析 • 自上而下的分析方法 • 自下而上的分析方法 • 句型分析的有关问题
1、自上而下的分析方法 例3.9 文法G[S] (1) SaAd (2) Aab (3) Aa 它识别w=cabd S S S A d c c A d a b
2、自下而上的分析方法 S A A c a b d c a b d c a b d
3、句型分析的有关问题 在上例对串cabd的分析中,如果不选择产生式(2) Aab,而选择产生式(3)Aa,则达不到归约S 的结果,也无从知道cabd是不是一个句子。 S d c A a
定义3.8 令G是一个文法,S是文法的开始符,αβδ是文 法G的一个句型。如果有:S=*> αAδ,且A β,则β是句型 Αβδ相对于非终结符A的短语。 如果有A=> β,则称β是句型αβδ相对于规则A=> β的 直接短语。 一个句型的最左直接短语称为该句型的句柄。
3.7 有关文法实用中的一些说明 1、有关文法的实用限制: 在实用中,我们将限制文法中不得含有有害规则和 多余规则。 有害规则是指形为UU的产生式,它对描述语言没有必要。 只会引起文法的二义性。 多余规则是指文法中连一个句子的推导都用不到的规则。 它的两种出现方式: (1)文法中某些非终结符不在任何规则的右部出现。 (2)在文法中有那样的非终结符,不能够从它推出终 结符号串来。
例 3.10 文法G{S}: (1) SBe (2) BCe (3) BAf (4) AAf (5) Ae (6) CCf (7) Df 其中非终结符D不在右部出现,它是不可达的,故 (7)式是多余规则。 规则(2)(6)不能推出以终结符为结束的串,它是 不可终此的。故也是多余规则。