640 likes | 908 Views
第 3 章 文法和语言. 3.1 文法的直观概念. 语言. 语言是由句子组成的集合,是由一组记号所构成的集合 。 汉语 --所有符合汉语语法的句子的全体 英语 --所有符合英语语法的句子的全体 程序设计语言 --所有该语言的程序的全体 研究语言 : 每个句子构成的规律 每个句子的含义 每个句子和使用者的关系. 返回目录. 研究程序设计语言: 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系 语言研究的三个方面: 语法 Syntax
E N D
第3章 文法和语言 3.1 文法的直观概念 语言 • 语言是由句子组成的集合,是由一组记号所构成的集合。 • 汉语--所有符合汉语语法的句子的全体 • 英语--所有符合英语语法的句子的全体 • 程序设计语言--所有该语言的程序的全体 • 研究语言 : • 每个句子构成的规律 • 每个句子的含义 • 每个句子和使用者的关系 返回目录
研究程序设计语言: 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系 语言研究的三个方面: 语法 Syntax 语义 Semantics 语用 Pragmatics
语法 -- 表示构成语言句子的各个记号之间的组合规律。 语义 -- 表示按照各种表示方法所表示的各个记号的特定含义。(各个记号和记号所表示的对象之间的关系)。 语用 --表示在各个记号所出现的行为中,它们的来源、使用和影响。
形式语言 • 如果不考虑语义和语用,即只从语法这一侧面来看语言,这种意义下的语言称作形式语言。 • 形式语言抽象地定义为一个数学系统。“形式”是指这样的事实:语言的所有规则只以什么符号串能出现的方式来陈述。形式语言理论是对符号串集合的表示法、结构及其特性的研究。是程序设计语言语法分析研究的基础。
文法 以自然语言为例:用 EBNF 描述一种语言: 〈句子〉::= 〈主语〉〈谓语〉 〈主语〉::= 〈代词〉|〈名词〉 〈代词〉::= 你 | 我 | 他 〈名词〉::= 王明 | 大学生 | 工人 | 英语 〈谓语〉::= 〈动词〉〈直接宾语〉 〈动词〉::= 是 | 学习 〈直接宾语〉::= 〈代词〉|〈名词〉 “我是大学生”是否是该语言的句子?
〈句子〉::= 〈主语〉〈谓语〉 〈主语〉::= 〈代词〉|〈名词〉 〈代词〉::= 你 | 我 | 他 〈名词〉::= 王明 | 大学生 | 工人 | 英语 〈谓语〉::= 〈动词〉〈直接宾语〉 〈动词〉::= 是 | 学习 〈直接宾语〉::= 〈代词〉|〈名词〉 〈句子〉 〈主语〉〈谓语〉 〈代词〉〈谓语〉 我〈谓语〉 我〈动词〉〈直接宾语〉 我是〈直接宾语〉 我是〈名词〉 我是大学生
下列语句是否为该文法的句子: 我大学生是 大学生是王明 英语学习王明 大学生学习他 工人是英语 我是大学生 王明是大学生 王明学习英语 他学习英语 你是工人
3.2 符号和符号串 • 字母表:元素的非空有穷集合。(符号集) • 符号:字母表中的元素。 例如: 汉语的字母表中包括汉字、数字及标点符号等。 PASCAL语言的字母表是由字母、数字、若干专用符号及BEGIN、IF之类的保留字组成。
符号串:由字母表中的符号组成的任何有穷序列称为该字母表上的符号串。符号串:由字母表中的符号组成的任何有穷序列称为该字母表上的符号串。 • 1.空符号串ε(没有符号的符号串)是上的符号串 • 2.若x是上的符号串,a是的元素,则xa是上的符号串 • 3.y是上的符号串,当且仅当它可以由1和2导出。 • 例如: Σ={a,b} ε,a,b,aa,ab,aabba,…,都是上的符号串
例: Σ={0,1}ε,0,1,00,01,11,1001110等都是上的符号串。 例: Σ={a,b,c}上的符号串有:a,b,c,ab,ba,aaca,acaa等。 • 注意: • 符号串中的符号排列是有顺序的。 • 可以用字母表示符号串,如 x=aaca。
如果 z = xy 是一符号串,那么: • x 是 z 的头,y 是 z 的尾; • 如果 x 非空,那么 y 是固有尾;如果 y 非空,那么 x 是固有头。 例: 设 z = abc, 那么 z 的头是: ε,a ,ab , abc(除 abc 外都是固有头) z 的尾是: ε,c ,bc , abc(除 abc 外都是固有尾)
几种表示法(x,z是符号串,t是符号): • z = x… x 是符号串 z 的头 • z = …x… x 在符号串z 中某处出现 • z = t… 符号 t 是 符号串 z 的第一个符号
符号串的运算 • 符号串的长度:符号串中符号的个数.符号串s的长度记为|s|。 ε的长度为0 • 连接:符号串x、y的连接,是把y的符号写在x的符号之后得到的符号串xy 例 x=ST,y=abu 则 xy=STabu |x|=2,|y|=3,|xy|=5 • εx = xε= x
方幂:符号串x自身连接n次得到的符号串 xx…xx(n个x)定义为 xn。 • x0=ε, x1=x, x2=xx, x3=xxx • x=AB, 则 x0=ε, x1=AB, x2=ABAB, x3=ABABAB • 对于 n>0, xn = xxn-1 = xn-1x
符号串集合:若集合A中一切元素都是某字母表上的符号串,则称A为字母表上的符号串集合。符号串集合:若集合A中一切元素都是某字母表上的符号串,则称A为字母表上的符号串集合。 • 两个符号串集合A和B的乘积定义为AB =xy|xA且yB若 集合A=a,b B = c,d则 AB =ac,ad,bc,bd {ε}A = A {ε}= A (∵εx = xε= x) • 使用 * 表示上的所有有穷长的串(包括ε)的集合。Σ*称为Σ的闭包。 • 从*中除去ε得到的集合记为+。Σ+称为Σ的正闭包。
Σ* = Σ0 ∪ Σ1 ∪ Σ2 … ∪ Σn … Σ+ = Σ1 ∪ Σ2 … ∪ Σn … Σ* = Σ0 ∪ Σ+ Σ+ = ΣΣ* = Σ* Σ Σ+ = Σ* -{ε} 例:设Σ={0,1},则 Σ* ={ε, 0, 1, 00, 01, 10, 11, 000, 001, 010,…} 例:设Σ={a,b},则 Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}
3.3 文法和语言的形式定义 • 规则(重写规则、产生式或生成式),是形如α→β或α∷=β的(α,β)有序对,其中α是某字母表V的正闭包V+中的一个符号,β是V*中的一个符号。(α∈V+,β∈V*) • α称为规则的左部(或生成式的左部)。 • β称为规则的右部(或生成式的右部)。
文法的定义 • 文法G定义为四元组(VN,VT,P,S) • VN:非终结符集 • VT :终结符集 • P:产生式(规则)集合 • S:开始符号(识别符号) • VN、VT和 P 是非空有穷集。S 至少在一条规则中作为左部出现。 • VN∩VT= φ, S∈VN • V=VN∪VT,称为文法G的字母表(字汇表)。
例3.1 文法G=(VN,VT,P,S) VN = { S }, VT ={ 0, 1 } P={ S→0S1, S→01 } S为开始符号
例3.2 文法G=(VN,VT,P,S) VN ={标识符,字母,数字} VT ={a,b,c,…x,y,z,0,1,…,9} P={<标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→a,…, <字母>→z <数字>→0,…, <数字>→9 } S=<标识符>
习惯上只将产生式写出。并有如下约定: • 第一条产生式的左部是开始符号。 • 用尖括号括起的是非终结符,否则为终结符。或者大写字母表示非终结符,小写字母表示终结符。 • G可写成G[S],其中S是开始符号。 例3.1 文法G=(VN,VT,P,S) VN = { S }, VT ={ 0, 1 } P={ S→0S1, S→01 } S为开始符号 可写成: G:S→0S1 S→01 或写成: G[S]:S→0S1 S→01
推导的定义 • 直接推导“” • α→β是文法G的产生式,γ,δ∈V*,若有v,w满足: • v=γαδ,w= γβδ, • 则说:v(应用规则α→β)直接产生w • 或说:w是v的直接推导 • 或说:w直接归约到v • 记作v w
例:G: S→0S1, S→01 直接推导: 0S10011 (v=0S1,w=0011,使用规则S→01,γ=0,δ=1) S 0S1 (v=S,w=0S1,使用规则S→0S1,γ=ε,δ= ε ) 0S100S11 (v=0S1,w=00S11,使用规则S→0S1,γ=0,δ=1)
例 : 文法G=(VN,VT,P,S) VN ={标识符,字母,数字} VT ={a,b,c,…x,y,z,0,1,…,9} P={<标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→a,…, <字母>→z <数字>→0,…, <数字>→9 } S=<标识符> 指出下面直接推导所使用的规则: <标识符> <标识符><字母> <标识符><字母> <数字> <字母> <字母> <数字> abc <数字> abc5
和 + * 若存在v =w0 w1 ... wn=w, (n>0) 则称v推导出(产生)w(推导长度为n),或称w归约到v. 记作 v w 若有v w,或v=w, 则记为v w + + + + * * 例:G: S→0S1, S→01 0S1 00S11 000S111 00001111 即 0S1 00001111 也记作 0S1 00001111 + * * *
例 G: <标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→a,…, <字母>→z <数字>→0,…, <数字>→9 <标识符> <标识符><数字> <字母> <数字> x <数字> x 1 即: <标识符> x1 ,也可记作: <标识符>x1 + * + *
文法的句型、句子的定义 • 句型 • 设G[S]是一文法,如果符号串x是从识别符号推导出来的,即S x,则称x是文法G[S]的句型。 • 句子 • x仅由终结符号组成(即S x,且x∈VT*),则称x是G[S]的句子。 • 例:G: S→0S1, S→01 • S 0S1 00S11 000S111 00001111 * * * *
由文法G生成的语言记为L(G),它是文法G的一切句子的集合: L(G)={x|S x,其中S为文法的开始符号,且x ∈VT*} 例:G: S→0S1, S→01 L(G)={0n1n|n≥1} 语言的定义 * *
例3.3 文法G[S]: (1)S→aSBE (2)S→aBE (3)EB→BE (4)aB→ab (5)bB→bb (6)bE→be (7)eE→eeL(G)={ anbnen | n≥1 }
S a S BE (S→aSBE) a aBEBE (S→aBE) aabEBE (aB→ab ) aabBEE ( EB→BE ) aabbEE (bB→bb) aabbeE (bE→be) aabbee (eE→ee) 文法G[S]: (1)S→aSBE (2)S→aBE (3)EB→BE (4)aB→ab (5)bB→bb (6)bE→be (7)eE→ee S a S BE aaSBEBE aaaBEBEBE G生成的每个串都在L(G)中L(G)中的每个串确实能被G生成
若L(G1)=L(G2),则称文法G1和G2是等价的。 如文法G1[A]:A→0R 与G2[S]:S→0S1 等价 A→01 S→01 R→A1 文法的等价
通过对产生式施加不同的限制,Chomsky将文法分为四种类型: 0型文法:对任一产生式α→β,都有α∈(VN∪VT)+, β∈(VN∪VT)* 1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 S→ε除外 2型文法:对任一产生式α→β,都有α∈VN , β∈(VN∪VT)* 3型文法:任一产生式α→β的形式都为A→aB或A→a,其中A∈VN ,B∈VN ,a∈VT 3.4 文法的类型
1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 S→ε除外 上下文有关文法: α1Aα2→α1βα2(A在VN中,其他在V*中,β≠ε) 2型文法:对任一产生式α→β,都有α∈VN , β∈(VN∪VT)* 上下文无关文法:A→β(A在VN中,β在V*中,) 3型文法也叫正规文法
例:1型(上下文有关)文法 文法G[S]: S→aSBE S→aBE EB→BE aB→ab bB→bb bE→be eE→ee
例:1型(上下文有关)文法 文法G[S]: S→CD Ab→bA C→aCA Ba→aB C→bCB Bb→bB AD→aD C→ε BD→bD D→ε Aa→bD L(G)={ww|w∈{a,b}*}
例:2型(上下文无关)文法 文法G[S]: S→aB|bA A→a|aS|bAA B→b|bS|aBB 文法G[S]: S→0A|1B|0 A→0A|1B|0S B→1B|1|0
例:定义标识符的3型(正规)文法 文法G[I]: I → lT I → l T → lT T → dT T → l T → d
0型文法产生的语言称为0型语言 1型文法或上下文有关文法( CSG )产生的语言称为1型语言或上下文有关语言(CSL) 2型文法或上下文无关文法( CFG )产生的语言称为2型语言或上下文无关语言( CF L ) 3型文法或正则(正规)文法( RG )产生的语言称为3型语言正则(正规)语言( RL ) 文法和语言
上下文无关文法有足够的能力描述现今程序设计语言的语法结构 算术表达式 语句 赋值语句 条件语句 读语句 …… 3.5 上下文无关文法及其语法树
文法G=({E}, {+,*,i,(,)}, P, E} P: E → i E → E+E E → E*E E → (E) 算术表达式上下文无关文法表示
<条件语句>→if<条件>then<语句> | if<条件>then<语句>else <语句> 条件语句上下文无关文法表示
用于描述上下文无关文法的句型推导的直观方法用于描述上下文无关文法的句型推导的直观方法 上下文无关文法的语法树 例: G[S]: S→aAS A→SbA A→SS S→a A→ba 句型aabbaa的语法树(推导树) S a A S S b A a a b a 叶子结点:树中没有子孙的结点。从左到右读出推导树的叶子标记,所得的句型为推导树的结果。也把该推导树称为该句型的语法树。
推导过程中施用产生式的顺序 句型aabbaa的语法树(推导树) 例: G[S]: S→aAS A→SbA A→SS S→a A→ba S a A S S b A a a b a SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa
最左(最右)推导:在推导的任何一步αβ,其中α、β是句型,都是对α中的最左(右)非终结符进行替换最左(最右)推导:在推导的任何一步αβ,其中α、β是句型,都是对α中的最左(右)非终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型 例: G[S]: S→aAS A→SbA A→SS S→a A→ba SaASaAaaSbAaaSbbaaaabbaa SaASaSbASaabASaabbaSaabbaa SaASaSbASaSbAaaabAaaabbaa
例:G[E]: E → i E → E+E E → E*E E → (E) 问题:一个句型是否对应唯一的一棵语法树? E E + E E * E i i i E E * E i E + E i 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
若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的。若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的。 产生某上下文无关语言的每一个文法都是二义的,则称此语言是先天二义的。 二义文法
判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的。但可以为无二义性寻找一组充分条件。判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的。但可以为无二义性寻找一组充分条件。 二义文法改造为无二义文法 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) 规定优先顺序和结合律
句型分析 就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 句型分析的意义 在编译过程中句型分析可以判断一个程序是否符合该语言的语法规则,即程序有无语法错误。 在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序。分析算法又称识别算法。 从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号。 3.6 句型的分析
对于直接推导:v w,我们可以说:v直接产生w或w直接归约到v。所以可以从两个方向来考虑推导序列的建立过程。 对于上下文无关文法,语法树是句型推导过程的几何表示,故可借助语法树进行句型分析。 句型分析方法
1.分析思想 从文法的开始符号出发,反复使用各种产生式,寻找“匹配”于输入符号串的推导。 例: 2.语法树的构建过程 从文法开始符号出发,将它做为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。 例: 3.存在的相关问题 对于同一个非终结符的多个产生式,如: A→ α1|α2|…|αn,如何确定用哪个产生式的右部去替代A呢?有一种解决办法是从各种可能的选择中随机挑选一种,并希望它是正确的。如果以后发现它是错误的,我们必须退回去,再试另外的选择,这种方式称为回溯。显然这样做代价极高。 自上而下的分析方法