740 likes | 967 Views
第二章 文法和语言. 语言概述 基本概念 : 符号串与符号串集合 文法和语言的形式定义 语法树与文法的二义性 形式语言的分类. 第一节 语言概述. 一、语言 某一字母表上符号串(句子)的集合。 语言研究的三个方面: 语法 — 构成语言句子的各个记号之间的组合规 律。 语义 — 按照各种表示方法所描述的各个记号的 特定的含义。 语用 — 在各个记号所出现的行为中,它们的来 源、使用和影响。. 二、形式语言.
E N D
第二章 文法和语言 语言概述 基本概念:符号串与符号串集合 文法和语言的形式定义 语法树与文法的二义性 形式语言的分类
第一节 语言概述 一、语言 某一字母表上符号串(句子)的集合。 语言研究的三个方面: 语法—构成语言句子的各个记号之间的组合规 律。 语义—按照各种表示方法所描述的各个记号的 特定的含义。 语用—在各个记号所出现的行为中,它们的来 源、使用和影响。
二、形式语言 • Chomsky于1956年提出了一种用来描述语言的数学系统。人们把用一组数学符号和规则来描述语言的方式称为形式描述,而把所用的数学符号和规则称为形式语言。 • 形式语言,只是从语法上研究语言。它是抽象的数学系统,用于模拟程序设计语言的语法,或者是并不很成功地模拟自然语言如英语的语法。 • 形式语言理论是编译理论的重要基础,它主要研究组成符号语言的符号串的集合及它们的表示法、结构与特性。
三、语言的描述方法 • 枚举法 当某种语言中的句子有限时。例如只含有两个句子的语 言:{“She is a girl”,“she is my friends”} • 形式化描述 指定有限个规则,用于产生所要描述的语言的全部句子, 这些规则构成了该语言的文法。 • 自动机方法 建立一种装置(算法或过程),它以某字母表上的符号 串为输入,判别该符号串是否为其所描述的语言的句子, 此装置即为自动机。
第二节 符号串和符号串集合 • 基本定义 • 它们的运算
符号与字母表 • 例如: Σ= {0,1} V = {a, b,c…z} A={begin,if,real,end} • 字母表:由若干元素(符号、字母)所组成的有限非空集合。常用大写英文字母A,B… 或希腊字母Σ表示。 • 符号:可以相互区别的记号(元素)。
符号串及其长度 例如: • a, b, c, ab, ac, aaa, abc都是字母表{a, b, c}上的符号串。(还有哪些字符串?) • abc的长度是|abc|=3, 100010的长度|100010|=6 • |ε|= 0 • 符号串:由字母表中的符号组成的任何有穷序列称为符号串。常用小写英文字母u,v等表示符号串。 • 符号串的长度:符号串中符号的个数, 符号串x的长度用|x|表示。 • 空串ε:长度为0的符号串。
子符号串 • 例如 符号串x=a+b*(c+d),则 a, a+b*, 与(c+d)等都是x的子符号串,且 其长度分别为|a|=1, |a+b*|=4, |(c+d)|=5 • 设有非空符号串u=xvy,其中符号串 ,则称v为符号串u的子符号串。 V≠ε
符号串的前缀与后缀 • 例如:字母表A={a,b,c}上的符号串x=abc, 则x的 前缀:ε, a, ab, abc, 后缀:ε, c, bc, abc 真前缀: ε, a, ab, 真后缀:ε, c, bc • 如果z=xy是一个符号串,则x是z的前缀,而y是z的后缀。如果y非空,则x是z的真前缀;如果x非空,则y是z的真后缀。
对符号串的运算——连接 例如: • 字母表{a,b,c}上有符号串x=ab与y=cba,则 z=xy=abcba • 设x、y是同一字母表上的两个符号串,则把y的各个符号写在x的符号之后得到的符号串,称为x与y的连接,记作xy。 • 对于任何字母表上的符号串x,有 • 注意:不同字母表上的符号串不能进行连接运算。 考虑: • |x|= • |y|= • |z|= • |xy|= 2 3 5 |x|+|y|
对符号串的运算——方幂 例如: • x1=x, x2=xx, x3=xxx, • 设x=ab,则 x0= x3=xxx=ababab • 设x是符号串,把x自身连接n次得到的符号串,即z=xx…x(n个x),称为x的n次方幂,记作xn。 • 注意:x0= ,|x0|=0 • xn=xxn-1=xn-1x |xn|=n|x|
符号串集合 例: • 枚举表示法 {1,11,111,1111} • 省略表示法 {1,11,111,…} • 描述表示法 {x|x全由1组成,且|x|≥1} • 符号串集合:若集合中所有元素都是某字母表上的符号串,则称之为该字母表上的符号串集合。通常用大写英文字母A,B,C…表示。 • 空集:φ,注意与ε的区别。 • 字母是一个符号串集合,每个符号串的长度为1.
符号串集合的乘积 • 例: 设A={a,b}, B={c,d,e},则 AB={ac,ad,ae,bc,bd,be} 符号串集合的乘积定义为: x是符号串集合A中的符号串,y是符号串集合B中的符号串。
符号串集合的方幂 • A0= A1=A, A2=AA, … An=An-1A=AAn-1 • 字母表是一个特殊的符号串集合。当A为字母表时 若 An, 则 |x|=n 例如: • 字母表A={a,b,c},则 A2=AA={a,b,c}{a,b,c} ={aa,ab,ac,ba,bb,bc,ca,cb,cc}
符号串集合的闭包与正闭包 • 闭包:Σ*称为Σ的闭包,若Σ*表示Σ上的所有有穷长的串的集合。 • 正闭包:Σ+称为Σ的正闭包,若
字母表的闭包与正闭包 对于字母表A,它的 • 闭包: • 正闭包: • 显然 A+=AA*=A*A
举例 例1:回忆C语言所采用的输入字母表。 例2:设字母表A={a},其上有符号串t=aa。写出下列符号串及其长度: (1)t0 (2)ttt (3)t3 (4)t5 例3:若有字母表A={0,1},则A+=?它可以用于描述什么语言? 例4:令字母表L={A,B,C,…,Z,a,b,c,…,z},D=(0,1,2,…9),求下列运算的结果? (1)L∪D (2)LD4 (3)L(L∪D)15 (4)D+
引例1 <句子>::=<主语><谓语><状语> <主语>::=<名词> <谓语>::=<动词> <状语>::=<介词><名词> <名词>::=Peter | Berry | river <动词>::=swims <介词>::=in 注:<句子>为要定义的目标,称为识别符号或开始符号。
引例2 问:该规则可以产生什么语言? 有如下规则: <标识符>→<字母> <标识符> → <标识符> <字母> <标识符> → <标识符> <数字> <字母> → A <字母> → B <字母> → C <数字> → 0 <数字> → 1
第 三 节 文法和语言的形式定义 • 文法的定义 • 规则的定义 • 推导的定义 • 句型、句子及语言的定义
一、文法 规则的非空有穷集合,用G[S]表示,G是文法名, S是识别符号。文法通常表示成四元组的形式: G=(VN,VT,P,S) 其中:VN—非终结符,用来表示语法范畴。 VT —终结符,语言中不可再分的字符串。 S —开始符号或识别符号,一个特殊的非终 结符,表示所定义的最大的语法范畴。 P —规则
问题1:什么是规则(产生式)? • 形式为U::=u (或U→u) 其中U∈V+且至少包含一个非终结符; u∈V*;且V=VN∪VT。 U称为规则(产生式)左部,u称为(产生式)规则右部。 • 非终结符号:需要进一步定义的符号,不会出现在程序中。 • 终结符号:不需要再定义,会出现在程序中。
注意: 1、VN∩VT=Ø,即文法中的任意一个符号要么是非终结符,要么是终结符。 2、只用一个产生式并不足以定义一个语法范畴,一般都需要几个产生式,特别是需要含有递归的产生式。 3、开始符号至少必须在某个产生式的左部出现一次。
例:试构造产生标识符的文法。 S→L|LP P →T|PT T →L|D L →a|b|c|d…|z D →0|1|…|9
例:写一文法,使其语言是奇数集合,但不 允许出现以0开头的奇数。 N →A|MA M →B|MD A →1|3|5|7|9 B →1|2|3|4|5|6|7|8|9 D →0|B
问题2:如何由文法产生语言? • 基本思想是:从识别符号开始,把当前产生的符号串中的非终结符号替换为相应规则右部的符号串,直到最终全由终结符号组成。这种替换过程称为推导或产生句子的过程,每一步成为直接推导或直接产生。 • 注:语法上的正确性不能保证语义上的正确性。
二、直接推导和规范推导 • 直接推导“” 设α → β是文法G的产生式,若有v,w满足: v=x α y, w= x βy, 其中x∈V*, y∈V* 则称v直接推导到w, 记作:v w 或w直接归约到v 例:G: S→0S1, S→01 S 0S1 00S11 000S111 00001111
直接推导序列: + 若存在v =u0 u1 ... un=w, (n>0) 则称v + w,v推导出w,或w归约到v(至少有1步推导),这个直接推导序列的长度为n。 • 广义推导: * 若有v + w 或 v=w, 则记为v * w,v广义推导出w,w广义规约到v(可以包含0步推导)
例:设有文法G[N1]: N1→N N →ND|D D→0|1|2 则句子12可由三种不同的推导序列推导出来: (1) N1N ND N2 D2 12 (2)N1N ND DD 1D 12 (3) N1N ND DD D2 12
. . • 规范推导和规范归约 最左推导和最右推导:对于一个推导序列中的每一步 直接推导,都是对最左(最右)非终结符进行替换。 最右推导也称规范推导,它的逆过程称为最左规约, 也称规范规约。 若用 表示规约,设A→a是文法G中的一个规则, 则对于 xAy xay 有 xay xAy
例:文法G[S]: S→AB A→A0|1B B→0|S1 请给出句子101001的最左和最右推导。 最左推导: S AB 1B B10B10S110AB1101BB11010B1101001 最右推导: S ABAS1AAB1AA01A1B01A10011B1001101001
例:有文法如下,G[E]:E→E+T|T T→T*F|F F→(E)|a该文法的开始符号是?非终结符号集是?终结符号集是?如何得到句子a+a*a? EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a
小结:文法和语言的关系 • 已知描述语言,可以写出相应的文法。 (注意:该文法并不惟一。) • 已知文法,可以得到由该文法产生的语言。 (用推导的方法得到的所有句子的集合)
语言的形式定义 • 语言 L(G)={ x | S * x,其中S为文法开始符号,且 x ∈VT+} 文法描述的语言是该文法一切句子的集合。 • 例1:G: S→0S1, S→01 L(G)={0n1n|n≥1}
例2: 文法G[S]: (1)S→aSBE (2)S→aBE (3)EB→BE (4)aB→ab (5)bB→bb (6)bE→be (7)eE→ee L(G)={ anbnen | n≥1 }
文法的递归性和等价性 文法的递归性定义:对于某文法,存在U∈VN, 如果U + …U..., 则称该文法递归于U; 如果U + U…,则称该文法左递归于U; 如果U + …U,则称该文法右递归于U。 以上形式的规则(产生式)也称为递归规则。
例1:C-语言中: program→declaration_list declaration_list→declaration_list declaration | declaration • 例2:U→Vx V→Uy|z(都不递归) 但是有 U + Uyx,所以该文法是左递归的。 注:1、描述程序设计语言的文法必定都是递归的。 2、递归规则的存在,使得能用有穷个规则来 定义无穷的语言。
文法的等价性定义:两个文法的规则不同,但产生的文法的等价性定义:两个文法的规则不同,但产生的 语言却有可能完全相同,即L(G1)=L(G2),则称 文法G1和G2是等价的。 如:下列两个文法G1[A]与G2[S]等价 G1[A]:A→0R G2[S]:S→0S1 A→01 S→01 R→A1 L(G1) = L(G2) = {0n1n|n≥1}
句型分析的相关基本概念 • 句型和句子 • 短语、直接短语和句柄 • 语法树和文法的二义性
句型和句子 • 设G[S]是一文法,如果符号串x是从识别符号S推导所得的,即 S * x x∈V+ 则称符号串x是文法G的一个句型。 如果句型x仅 由终结符号组成,即 S * x x∈VT* 则称x是文法G的句子。 • 例1:G: S→0S1, S→01 S 0S1 00S11 000S11100001111 句型 句子
短语和直接短语 • 设G[S]是一个文法,w=xuy是该文法的一个句型,如果有S * xUy , U∈VN , 且 U + u , u∈V+ 则称u是句型w中相对于U的短语。 如果有S * xUy , U u 则称u是句型w中相对于U的直接短语。 • 注:任何一句型可能包含若干个短语或简单短语。
句柄 • 句型的句柄:一个句型的最左简单短语。 • 任何句型的句柄总是存在,且惟一。 例:对于文法G[S]:S→AB A → Aa|bB B → a|Sb 求句型baSb的全部短语、直接短语和句柄? 该句型的短语有Sb、a、ba及自身; 直接短语有Sb、a; 其中a为句柄
例:设有文法G[S]:S→aAcBe A →Ab|b B →d 1、考虑句型aAbcde,判断b是否为其一个短语? 2、求句型aAbcde的短语、直接短语和句柄。
语法树 给定文法G,G=(VN,VT,P,S),对于G的任何句型都能构造与 之关联的语法树(推导树)。这棵树具有下列特征: 1、根结点的标记是开始符号S。 2、每个结点的标记都是V中的一个符号。 3、若一棵子树的根结点为A,且其所有直接子孙的标记从左向右的排列次序为A1A2…AR,那么 A→A1A2..AR一定是P中的一条规则。 4、若一标记为A的结点至少有一个除它以外的子孙,则A∈VN 。 5、若树的所有叶结点上的标记从左到右排列为字符串w,则w是文法G的句型;若w中仅含终结符号,则w为文法G所产生的句子。
问题1:用语法树求短语、句柄 • 短语:(子)树的末端结点形成的符号串是相对于(子)树根的短语。 • 直接短语:简单子树的末端结点形成的符号串是相对于简单子树根的简单短语。 • 句柄:最左简单子树的末端结点形成的符号串是句柄。
S A S B B b S b a 例:对于文法G[S]:S→AB A → Aa|bB B → a|Sb 求句型baSb的全部短语、直接短语和句柄? • baSb为句型baSb的相对于S的短语; • ba为句型baSb的相对于A的短语; • a为句型baSb的相对于B的短语,且为直接短语和句柄; • Sb为句型baSb的相对于B的短语,且为直接短语。
问题2:语法树的构造过程 • 例如:推导 S AB AcBd Accdd abccdd • 方法:把识别符号做为根结点,对每一个直接推导画一个分支,分支的名字是直接推导中被替换的非终结符号,分支的分支结点符号串是相对于分支名字的简单短语。直到再无分支可画结束。 S A B a b c B d c d
S AB AcBd Accdd abccdd S S S A B (1) A B (2) (3) c B d S S A B A B a b c B d c B d (5) (4) c d c d
问题3:从语法树构造推导 • 方法:从分支建立直接推导,然后从语法树中剪去之这个分支,直到无分支可剪。 • 语法树表明了在推导过程中使用了哪条规则和使用在哪个非终结符号上,但它并没有表明使用规则的顺序。 • 一棵语法树可能对应不止一种推导。
例如文法G[S]: S→AB A → aAb|ab B → cBd|cd 则对句子abccdd存在下面 的推导可能: • S ABAcBd (4) (3) Accdd abccdd (2) (1) • S ABabB abcBdabccdd S (4) A B (3) a b c B d (1) c d (2)