710 likes | 808 Views
第 3 章 文法和语言. 教学目的 : 使学生了解文法基本概念、文法类型,掌握文法和语言的形式定义,学会用语法树进行句型分析。 教学重点: 文法和语言的形式定义,句型分析。 课时分配: 4 学时. 本章知识点 ( 内容 ). 文法的直观概念. 符号和符号串. 文法和语言的形式定义. 文法的类型. 上下文无关文法及其语法树. 句型的分析. 有关文法实用中的一些说明. 3.1 文法的直观概念. 1 、 语言: 是由句子组成的集合,是由一组符号所构成的集合。 2 、 汉语: 所有符合汉语语法的句子的全体。 3 、 英语: 所有符合英语语法的句子的全体。
E N D
第3章 文法和语言 • 教学目的: 使学生了解文法基本概念、文法类型,掌握文法和语言的形式定义,学会用语法树进行句型分析。 • 教学重点:文法和语言的形式定义,句型分析。 • 课时分配:4学时
本章知识点(内容) 文法的直观概念 符号和符号串 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 句型的分析 有关文法实用中的一些说明
3.1文法的直观概念 1、语言:是由句子组成的集合,是由一组符号所构成的集合。 2、汉语:所有符合汉语语法的句子的全体。 3、英语:所有符合英语语法的句子的全体。 4、程序设计语言:所有该语言的程序的全体。 每个句子构成的规律 研究语言每个句子的含义 每个句子和使用者的关系
当我们表述一种语言时,无非是说明这种语言的当我们表述一种语言时,无非是说明这种语言的 句子,如果语言只含有有穷多个句子,则只需列出 句子的有穷集就行了,但对于含有无穷句子的语言 来讲,存在着如何给出它的有穷表示的问题。以自 然语言为例,人们无法列出全部句子,但是人们可 以给出一些规则,用这些规则来说明(或者定义)句 子的组成结构,比如汉语句子可以是由主语后随谓 语而成,构成谓语的是动词和直接宾语,我们采用 EBNF来表示这种句子的构成规则。
“我是大学生”是汉语的一个句子 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉
有了一组规则以后,按照如下方式用它们导出句子:开始去找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成:有了一组规则以后,按照如下方式用它们导出句子:开始去找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成: 〈句子〉 〈主语〉〈谓语〉, 然后在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应规则的∷=右端代替之。比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉, 那么得到:〈主语〉〈谓语〉 〈代词〉〈谓语〉, 重复做下去, 句子:“我是大学生”的全部动作过程是: 〈句子〉 〈主语〉〈谓语〉 〈代词〉〈谓语〉 我〈谓语〉 我〈动词〉〈直接宾语〉 我是〈直接宾语〉 我是〈名词〉 我是大学生
“我是大学生”的构成符合上述规则,而“我大学生是”不符合上述规则,我们说它不是句子。,这些规则就是我们判别句子结构合法与否的依据,可以将这些规则看成是一种元语言,用它描述汉语。 文法:就是这样一些规则的有穷集合,它是以有穷规则集来刻划无穷句子集合的工具。
3.2 符号和符号串 字母表:元素的非空有穷集,记为Σ,语言的字母表是由字母、数字、若干专用符号及保留字组成,是符号(元素)的非空有穷集合。 符号:字母表中的元素。 符号串:由字母表中的符号组成的任何有穷序列 空符号串:什么符号也不含的符号串,记为ε。 例:Σ={a,b,c,d,……z}。a、b、c……都称为符号。hello、stri、aezfg、main、fjfka都是Σ上的符号串。 符号串的长度:符号所包含符号的个数,设x是一符号串,其长度记为|x|。 例:|hello|=5,|main|=4,| ε |=0。
符号串的运算 • 1、符号串的长度:符号串中符号的个数。符号串s的长度记为|s|。 ε的长度为0 • 2、连接:符号串x、y的连接,是把y的符号写在x的符号之后得到的符号串xy 如 x=ab,y=cd 则 xy=abcd 有εa = aε • 3、方幂:符号串自身连接n次得到的符号串 an 定义为 aa…aa n个a a1=a, a2=aa则a0=ε
4、符号串集合:若集合A中所有元素都是某字母表上的符号串,则称A为字母表上的符号串集合。4、符号串集合:若集合A中所有元素都是某字母表上的符号串,则称A为字母表上的符号串集合。 5、两个符号串集合A和B的乘积定义为 AB =xy|xA且yB 【例】若 集合A=ab,cde B = 0,1 则 AB =ab1,ab0,cde0,cde1
使用 * 表示上的一切符号串(包括ε)组成的集合。Σ*称为Σ的闭包。 规定 Σ0 = {}. 令: Σ* = Σ0 Σ1 Σ2… 称 Σ*是Σ的闭包。 记Σ+ = Σ* -{}= Σ1 Σ2 Σn… , 称 Σ+是Σ的正则包。 • 【说明】 • 上的除ε外的所有符号串组成的集合记为+ 。Σ+称为Σ的正闭包。 • 闭包Σ*中的每个符号都是由Σ中的符号串经有限次连接而成的。
例:Σ={a,b} Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}
语 言 由句子组成的集合,是由一组符号所构成的集合。换言 之,字母表上的一个语言是上的一些符号串的集合 (字母 表上的每个语言是*的一个子集)。 【例如】字母表 Σ={a,b}, Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} 集合{ab,aabb,aaabbb,…,anbn,…} 或表示为{w|w∈Σ*且w=anbn,n≥1}为字母表上的一个语言。 集合{a,aa,aaa,…} 表示为{w|w∈Σ*且w=an,n≥1} 为字母表上的一个语言。 ε是一个语言。 即 是一个语言
3.3 文法和语言的形式定义 • 如何来描述一种语言? • 如果语言是有穷的(只含有有穷多个句子),可以将句子逐一列出来表示;如果语言是无穷的,找出语言的有穷表示。语言的有穷表示有两个 途径: 一、生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造。 • 二、识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”,要么永远继续下去。
文法是用生成方式描述语言的:语言中的每个句子可以用严格定义的规则来构造。下面给出文法的定义,而在文法的定义的基础上,给出推导的概念,句型、句子和语言的定义。文法是用生成方式描述语言的:语言中的每个句子可以用严格定义的规则来构造。下面给出文法的定义,而在文法的定义的基础上,给出推导的概念,句型、句子和语言的定义。
文法G定义为四元组(VN,VT,P,S )其中 VN为非终结符号(或语法实体,或变量)集; VT为终结符号集; P为产生式(也称规则)的集合; VN,VT和P是非空有穷集。 S称作识别符号或开始符号,它是一个非终结符,至少要在一条产生式中作为左部出现。 VN和VT不含公共的元素,即VN ∩VT = φ 用V表示VN ∪VT,称为文法G的字母表或字汇表 规则,也称重写规则、产生式或生成式,是形如α→β或α∷=β的(α,β)有序对,其中α是字母表V的正闭包V+中的一个符号,β是V*中的一个符号。α称为规则的左部,β称作规则的右部。
Define a grammar A grammar G is defined as a 4-tuple (VN,VT,P,S ) VNis a set of nonterminals VT is a set of terminals P is a set of productions,each production consists of a left side,an arrow(or ‘::=‘),and a right side S is a designation of one of the nonterminals as the start symbol V =VN ∪VT is the alphabet of G
文法的定义 【例】 文法G=(VN,VT,P,S) VN = { S }, VT ={ 0, 1 } P={ S→0S1, S→01 } S为开始符号
【例】 文法G=(VN,VT,P,S) VN ={标识符,字母,数字} VT ={a,b,c,…x,y,z,0,1,…,9} P={<标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→a,…, <字母>→z <数字>→0,…, <数字>→9 } S=<标识符>
文法的写法 【例1】G:S→aAb A→ab A→aAb A→ε 【例2】G[S]:A→ab A→aAb A→ε S→aSb 【例3】 G[S]: A→ab |aAb |ε S→aSb
文法产生的语言 文法产生的语言是由文法开始符号推导出的终结符号串的集合 1、推导、归纳、句型、句子和语言 假定G是一个文法,S是它的开始符号。如果S*(表示从S出发,经0步或若干步可推出,则称是一个句型。 仅含终结符号的句型是一个句子。这个过程称为推导推导的逆过程称为归纳。 文法G所产生的句子的全体是一个语言,将它记为L(G)。 L(G)={|S + & ∈VT }
【例】G: S→0S1, S→01 S 0S1 00S11 000S111 00001111 G的句型有 : S,0S1 ,00S11 ,000S111,00001111等。 G的句子 :00001111, 01等
例如:终结符号串(i*i+i)是文法 E→E+E|E*E|(E)|i 的一个句子。 因为: E(E)(E+E) (E*E+E) (i*E+E) (i*i+E) (i*i+i) 根据定义可知(i*i+i)是该文法的一个句子,而E,(E),(E*E+E)等是文法的句型。
【例】 例1:考虑一个文法G1: S→bA A→aA|a 它定义了一个什么语言呢? 从开始符S出发,我们可以推出如下句子: SbA ba SbA baA baa SbA baA … baa…a 可以写为:L(G1)={ban|n≥1}
【例】 设有文法G S→P|aPPb P →ba|bQa Q →ab 求语言L(G). 解: L(G)={ba,baba,abab,ababab… }
【例】 构造一个文法G3使 L(G3)={anbn|n≥1} 解; S→aSb|ab 【例】G: S→0S1, S→01 L(G)={0n1n|n≥1}
【例】 试构造生成语言L={anbnci|n1, i 0}的文法 解:G(Z): ZAB A aAb|ab B cB|
【例】 已知语言L={anbbn| n 1}, 写出产生L的文法。 解: G[S]: S aAb A aAb|b
【例】 已知文法G=({A,B,C},{a,b,c},A,P) 其中产生式P由以下组成: A abc A aBbc Bb bB Bc Cbcc bC Cb aC aaB aC aa 问:此文法表示的语言是什么? [解]:由于A为开始符。 由于AaBbc abBc abCbcc aCbbcc aabbcc 语言为: {anbncn, n>0 }
【例】试写一文法,使其描述的语言L(G) 是能被5整除的整数集合。 解: G(Z): Z (+|- )A(0|5) A 0|1|2|3|4|5|6|7|8|9|AA
【例】 已知语言L={x | x{a,b,c}*,且x重复排列是 对称的(aabcbaa,aabbaa,等) 写出该语言的文法。 解: G(Z): Z aZa|bZb|cZc|a|b|c|
3.4 文法的类型 语言学家乔姆斯基把文法分为四种类型 0型、1型、2型、3型。0行强于1型,1行强于2型,2型强于3型。这几种文法的差别在于对产生式施加不同的限制。 我们说G=(VT ,VN ,S ,P) 是一个0型文法,如果它的每个产生式 是这样的结构 (VNVT)* 且至少有一个非终结符,而(VNVT)* 。0型文法也称短语文法。
如果对0型文法分别施加以下的第i条限制,则我们就得到第i型文法:如果对0型文法分别施加以下的第i条限制,则我们就得到第i型文法: (1)G的任何产生式 均满足 ||≤ ||(其中||和||分别为和的长度;仅S例外 (2)G的任何产生式为A, AVN , (VN VT)* 。 (3) G的任何产生式为AB或 A,其中VT*,A、B VN 。 【说明】其中1型文法也称上下文有关文法。这种文法意味着,对非终结符进行替换时务必考虑上下文并且一般不允许替换成空串。
2型文法也称上下文无关文法,注意其语言定义:2型文法也称上下文无关文法,注意其语言定义: G的任何产生式为A→β,A∈VN, β∈(VN∪VT)* 表明凡出现在产生式左边的符号都是非终结符。 3型文法也称右线性文法。3型文法还有另一种形式,称左线性文法:一个文法G为左线性文法,如果G的任何产生式为 A→B 或A→ ,其中∈VT , A、B ∈ VN 由于3型文法等价于正规式所以也称正规文法。
1型文法 2型文法 文法的类型 【说明】1、四种文法之间的逐级“包含”关系 0型文法 3型文法
2)若“ ”左侧有终结符,则该文法一定属于0型或1型文法。若产生式“ ”的左部的符号串长度均小于或等于产生式“ ”的右部的符号串长度,则为1型文法,否则为0型文法。 3)2、3型文法的产生式“ ”的左部仅为单个非终结符。若“ ”的左部形式上为AB或 A, VT,A、B VN (称为右线性,也可定义一个等价的左线性文法))
判断文法的类型 例:文法G[S]: S→CD Ab→bA C→aCA Ba→aB C→bCB Bb→bB AD→aD C→ε BD→bD D→ε Aa→bD
判断文法的类型 例: 文法G[S]: S→AB A→BS|0 B→SA|1
判断文法的类型 G[S]: S→0A|1B|0 A→0A|1B|0S B→1B|1|0 G[I]: I → lT I → l T → aT T → dT T → l T → d 思考:以上文法的类型?
判断下列文法类型 【例】文法G[S]:S →aSYZ S→aYZ aY→ay yY→yy yZ→yz ZY→YZ zZ→zz 【例】文法G[S]:S →xSYZ S→xYZ xY→x yY→yy yZ→yz ZY→YZ zZ→zz 【例】文法G[S]:S→aT T→bT|cT|b|c 【例】文法G[S]:S→xB|c B→Az A→cS
3.5 上下文无关文法及其语法树 上下文无关文法有足够的能力描述程序设计语言的语法结构 语法树---句型推导的直观表示 前面我们提到过可以用一张图表示一个句型的推导,这种表示称为语法分析树,或简称语法树。 语法树的根结由开始符号所标记。随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结。每个新结和其父亲结间都有一条连线。在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。
句型aabbaa的语法树(推导树) S a A S S b A a a b a 句型的语法树构造方法:以文法开始符S作为根结点,随着推导的展开,对句型中某个非终结符A用产生式A→α的右部替换时,对标记A的结点生成其子结点从左至右依次为α的子树,直至推导结束。 【例】 G[S]: S→aAS A→SbA A→SS S→a A→ba SaASaAaaSbAaaSbbaaaabbaa 从左到右读出推导树的叶子标记,所得的句型为推导树的结果(边缘)。
规范推导 规范句型 最左(最右)推导:在推导的任何一步αβ,其中α、β是句型,都是对α中的最左(右)非终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型
例: G[S]: S→aAS A→SbA A→SS S→a A→ba SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa
语法树 设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中的一个产生式。
上下文无关文法的语法树 句型aabbaa的可能推导序列和语法树 例: G[S]: S→aAS A→SbA A→SS S→a A→ba S a A S S b A a ab a SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa
一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。但是,一个句型是否只对应唯一的一棵语法树呢?一个句型是否只有唯一的一个最左(最右)推导呢?一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。但是,一个句型是否只对应唯一的一棵语法树呢?一个句型是否只有唯一的一个最左(最右)推导呢?
E E + E E * E i i i E E * E i E + E i i 问题:一个句型是否对应唯一的一棵语法树? 例:G[E]: E → i E → E+E E → E*E E → (E) 考虑句型i*i+i的语法树? 句型 i*i+i 的两个不同的最左推导: 推导1:E E+E E*E+E i*E+E i*i+E i*i+i 推导2:EE*E i*E i*E+E i*i+E i*i+i
二义文法 • 若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。或者,若一个文法存在某个句子有两个不同的最左(或右)推导,则称这个文法是二义的。 • 产生某上下文无关语言的每一个文法都是二义的,则称此语言是先天二义的。