710 likes | 865 Views
第二章 文法和语言. 在不了解形式语言及自动机理论的前提下就不能对计算机科学进行严肃的研究。. 版权所有, 1997 ( c) Dale Carnegie & Associates, Inc. 2.1 语言是什么. 语言的三个方面: 语法、语义、语用. 三种定义语言的方式: 枚举法:将语言中所有句子列举出来。 定有限条规则,用来产生所需描述的语言之中的全部句子。 —— 》文法. 建立一种装置(构造一个算法或过程),它以某一字母表上的所有符号串为输入,并检验或识别这些符号串,当该串为此字母表上需定义的语言的句子时就接受它,反之则拒绝它。 —— 》自动机.
E N D
第二章 文法和语言 在不了解形式语言及自动机理论的前提下就不能对计算机科学进行严肃的研究。 版权所有, 1997 (c) Dale Carnegie & Associates, Inc.
2.1 语言是什么 • 语言的三个方面: • 语法、语义、语用
三种定义语言的方式: • 枚举法:将语言中所有句子列举出来。 • 定有限条规则,用来产生所需描述的语言之中的全部句子。——》文法
建立一种装置(构造一个算法或过程),它以某一字母表上的所有符号串为输入,并检验或识别这些符号串,当该串为此字母表上需定义的语言的句子时就接受它,反之则拒绝它。——》自动机建立一种装置(构造一个算法或过程),它以某一字母表上的所有符号串为输入,并检验或识别这些符号串,当该串为此字母表上需定义的语言的句子时就接受它,反之则拒绝它。——》自动机
2.2.1若干概念与术语 • 字母表:由若干元素组成的有限非空集合,其中每一个元素称之为符号。符号为一抽象实体,特定场合才赋予具体含义,它是最基本的概念,无须给出形式定义。字母表有时被称为符号集。
符号串:由字母表中的符号所组成的任何有限序列。符号串:由字母表中的符号所组成的任何有限序列。 • 例:设A={a,b,c}为一字母表,则a,b,c,aa,……为符号串。
字母表上全部符号串所组成的集合为无限集。 字母表上全部符号串所组成的集合为无限集。 符号串的长度:符号串中所含符号个数。例如:符号串abc长度为3,记为|abc|=3,不包含任何符号的符号串称为空串,记为ε。
符号串的前缀、后缀及子串:设X为一符号串,其尾部删去若干符号(包括0个)之后剩余部分称为X的前缀。类似,可定义X的后缀。取掉X的前缀和后缀,剩余部分称为X的子串。符号串的前缀、后缀及子串:设X为一符号串,其尾部删去若干符号(包括0个)之后剩余部分称为X的前缀。类似,可定义X的后缀。取掉X的前缀和后缀,剩余部分称为X的子串。
符号串的连接与方幂:设X,Y为符号串,Y直接拼接在X之后所的符号串被称为符号串X,Y的连接。记为XY。一符号串X与自身的n 次连接称为符号串X的n 次方幂,记为 Xn 。X1 =X,特别X0=ε。
符号串集合的和与积:设A,B为两个符号串集合,则A,B的和为A+B={ω|ω∈A或ω∈B}。A,B的积为AB={xy|x∈A,且y∈B}。我们用Φ表示空集,请注意Φ、ε、{ε}的区别。符号串集合的和与积:设A,B为两个符号串集合,则A,B的和为A+B={ω|ω∈A或ω∈B}。A,B的积为AB={xy|x∈A,且y∈B}。我们用Φ表示空集,请注意Φ、ε、{ε}的区别。
符号串集合的方幂与闭包:设A为符号串集合,则A的方幂运算可定义如下:A0 ={ε} ,A1 =A,A2=AA,……An =A An-1= An-1A,n>0。 A的正闭包: A+ A的自反传递闭包: A*
可以证明:符号串x∈A+,当且仅当存在某个n,有x∈An;符号串y∈A*,当且仅当y=ε或y∈A+;可以证明:符号串x∈A+,当且仅当存在某个n,有x∈An;符号串y∈A*,当且仅当y=ε或y∈A+; • 类似可定义字母表上的和、积、方幂与闭包。
2.2.2 文法和语言的形式定义 • 我们可以从产生语言的角度给出文法与语言的形式定义。 • 考虑描述英语句子语法的方法,我们是用语法规则来描述英语句子的构成:
①.<句子>::=<主语短语><动词短语> ②.<主语短语>::=the<名词> ③.<动词短语>::=<动词><宾语短语> ④.<宾语短语>::=<冠词><名词> ⑤.<名词>::=monkey ⑥.<名词>::=banana ⑦.<动词>::=ate ⑧.<动词>::=has ⑨.<冠词>::=the ⑩.<冠词>::=a ……;
抽取描述任意一个语言语法所必须的几个要素,这几个要素构成了我们所说的文法:抽取描述任意一个语言语法所必须的几个要素,这几个要素构成了我们所说的文法:
定义2.1: 一个G[S]可以表示成型如(VN ,VT ,P,S)的四元式,VN, VT ,P均为非空有限集,分别称为非终结符集、终结符集、产生式集。S∈VN , 称为文法开始符。产生式的左右部出现的一切符号组成的集合称为字汇表,记为V。
下面讨论文法产生的语言,为描述如何由文法产生语言,必须给出产生式使用的形式描述:下面讨论文法产生的语言,为描述如何由文法产生语言,必须给出产生式使用的形式描述:
定义2.2: 设有一文法G[S]=(VN ,VT ,P,S),α,β是V上的两个符号串,说β是α的直接推导,当且仅当α,β可分别写成α=γυδ,β=γηδ,γ,δ∈V*,且υ→η∈P, 记作α=G>β或γυδ=G >γηδ,其中γ,δ可为ε,若G无须指明也可写成α=>β。
定义2.3: 设有一文法G[S]= (VN ,VT ,P,S),α,β是V上的两个符号串,说β是α的推导,如果①α=β,或者②存在V上的符号串序列 υ0,υ1,……υn使得α=υ0=>υ1=>……=>υn=β, n≥1,对情况①称为0步推导,情况②称为n步推导。n≥0的推导记为υ0=*>υn, n≥1的推导记为υ0=+> υn。
定义2.4: 设有一文法G[S]= (VN ,VT ,P,S),将能由文法开始符S推导出的符号串α称为文法G[S]的一个句型,当且仅当S=*>α,α∈V* ,特别当句型α仅由终结符号组成时,则它称为文法G[S]产生的句子。
定义2.5: 设有一文法G[S]= (VN ,VT ,P,S),将能由文法G[S]产生的全部句子所组成的集合称为G[S]产生的语言,且记为L(G[S]): L(G[S])={ω|S=*>ω,且ω∈VT*} 由于L(G[S])是VT*的子集,故L(G[S])是定义于字母表VT上的。
问题: • 无限的内容是如何用有限的规则表示的。
例2.1:请用文法描述高级语言中的标识符: G[<标识符>]:
<标识符>]→<字母>|<标识符><字母> |<标识符><数字> <字母>→A|B|……|Z <数字>→0|1|……|9 试自己用文法描述表达式。
定义2.6: 设有一文法G[S]= (VN ,VT ,P,S),A→α为文法G[S]的一个产生式,如果α具有γAδ形式,其中γ,δ不同时为ε则称A→α是直接递归的;若存在推导A=>α=*>γAδ则称A→α是递归的,A称为直接递归的或递归的非终结符,特别当γ=ε,δ≠ε时A→α分别称为直接左递归的或左递归的产生式。类似可得到右递归的有关定义。如果一个文法中至少含有一个递归的非终结符,该文法为递归文法。
注意:文法与语言之间不存在一一对应关系,一个文法产生唯一的语言,但一个语言可由若干个不同的文法表示。注意:文法与语言之间不存在一一对应关系,一个文法产生唯一的语言,但一个语言可由若干个不同的文法表示。 • 例2.2: 设L={a2n+1|n≥0},试用不同的文法对其进行描述。
定义2.7: 设有文法G1[S1]、G2[S2],若它们所产生的语言相同,即 L(G1[S1])=L(G2[S2]),则称G1[S1]与G2[S2]等价。 • 注意:前后文无关文法等价问题是不可判定的。
引理2.1: 设有一文法G[S]= (VN ,VT ,P,S),并设A→γBδ是P中的一个产生式,而B→β1,B→β2,……B→βK,是P中全部B-产生式,又设G1[S]= (VN ,VT ,P1,S)是这样的文法:其中P1是从P中删去A→γBδ并添加A→γβ1δ,A→γβ2δ,……,A→γβKδ所组成的集合,则: L(G1[S])=L(G[S])
2.3 句型的分析 • 所谓句型分析是指构造一算法,用以判定所给的符号串是否为某一文法的句型(句子)。在编译的词法、语法分析阶段都涉及句型分析。
分析分为两大类:自顶向下和自底向上。 • 自顶向下分析是从文法的开始符开始,利用产生式的右部去替代其左部,这个过程不断进行下去,直至得到所需判定的符号串,或可以判定该符号串不是此文法的句型(句子)。
自底向上分析是从所需判定的符号串开始,利用产生式的左部去替代其右部,这个过程不断进行下去,直至得到文法的开始符,或可以判定无法得到文法的开始符为止。自底向上分析是从所需判定的符号串开始,利用产生式的左部去替代其右部,这个过程不断进行下去,直至得到文法的开始符,或可以判定无法得到文法的开始符为止。
2.3.1规范推导与规范规约 • 一个句型至另一个句型的推导序列是不唯一的.为使句型按一种确定的推导序列产生,以方便我们进行句型分析算法的设计,通常仅考虑最左或最右推导。
α=*>xUy=>xυy=*>β,若x∈VT*,则该推导为最左推导,若y∈VT*,则该推导为最右推导。能由最左推导推导出的句型称为左句型,能由最右推导推导出的句型称为右句型,最右推导通常称为规范推导,能由规范推导推出的句型通常称为规范句型。α=*>xUy=>xυy=*>β,若x∈VT*,则该推导为最左推导,若y∈VT*,则该推导为最右推导。能由最左推导推导出的句型称为左句型,能由最右推导推导出的句型称为右句型,最右推导通常称为规范推导,能由规范推导推出的句型通常称为规范句型。 • 注意:句子一定可由最左(右)推导产生,而句型则不一定。
如何用自顶向下分析法判定一个终结符号串ω是否为某一个语言的句子?如何用自顶向下分析法判定一个终结符号串ω是否为某一个语言的句子?
自底向上分析是与自顶向下分析相反的一个过程,它从ω出发以相反的方向试图为ω建立起一个推导序列,这个反方向的推导称为规约,与规范推导反方向的规约称为规范规约,可以看出规范规约的难点是如何确定当前应被规约的最左子串。自底向上分析是与自顶向下分析相反的一个过程,它从ω出发以相反的方向试图为ω建立起一个推导序列,这个反方向的推导称为规约,与规范推导反方向的规约称为规范规约,可以看出规范规约的难点是如何确定当前应被规约的最左子串。
2.3.2 语法树和二义性 • 语法树可以用来表示一个文法所描述语言的句型(句子)的结构,它可以对句型分析起到很大的帮助作用。
设有一文法G[S]= (VN ,VT ,P,S),则满足下面四个条件的树被称为G[S]的一棵语法树: 树中的每一个节点均有一标记,它为V中的一个符号. 树的根节点标记以文法的开始符S。若一个节点至少有一个直接后继,则此节点上的标记是VN中的一个符号;若一个以A为标记的节点有K个直接后继,且按从左至右的顺序分别被标记为X1 ,X2,……XK则A→X1 X2 ...XK 必是G[S]的一个产生式。
例2.3:设有一描述表达式的文法G[E]: E→E+T|T T→T*F|F F→(E)| i 试给出符号串i+i*i的语法树。
该语法树可分别从推导和规约两个方向进行构造。该语法树可分别从推导和规约两个方向进行构造。 试考虑一棵语法树能反映哪些推导和规约的信息。 如果一个文法所描述语言的某个句子对应不只一棵语法树,则称该文法为二义性文法。
例2.4 设关于条件语句的文法: C→if B then C C→if B then C else C C→S 考虑符号串if B then if B then S else S 所对应的语法树,由于可构造出两个语法树,故该文法是一个二义性文法。
有关二义性文法的一个结论: 不存在一个算法,使得对于任给的前后文无关文法G都能确定G是否为二义性文法。 但对一些文法我们还是能判定的,例如LL(1),LR(0)文法都是无二义性的文法。二义性文法的充分条件之一:若一个文法含有既是左递归又是右递归的非终结符,则该文法为二义性文法。
2.3.4 短语和句柄 • 定义2.8: 设αβδ是G[S]的一个句型,其中α,δ∈V*,β∈V+,若对于A∈VN ,有S=*>αAδ及A=+>β,则称β是句型αβδ相对于非终结符A的短语,特别若S=*>αAδ及A=>β,则称β是句型αβδ相对于产生式A→β的直接短语。
定义2.9: 一个句型的最左直接短语称为此句型的句柄。
2.4 文法的化简与改造 2.4.1 无用符号及无用产生式的删除
无用符号:设有一文法G[S]= (VN ,VT ,P,S),说G中的一个符号X∈V是有用的是指X至少出现在一个句子的推导过程中,即满足: • 存在α,β∈V*,有S=*>αXβ • 存在ω∈VT* ,αXβ=*>ω • 否则X为无用符号。
设有文法G[S]= (VN ,VT ,P,S),首先用算法2.1改造该文法的到G1[S]= (VN1,VT ,P1,S),使得对于每一个X∈VN1,都有ω∈VT*,X=*>ω。
算法2.1: • 分别置VN1,P1为Φ。 • 对P中每一个产生式A→δ,若δ∈VT*,则将A放入VN1中。 • 对P中每一个产生式A→X1 X2……XK,若每一个Xi 都属于VT或VN1,则将A放入VN1中。 • 重复③直至VN1不增大。 • 对于P中的每一个产生式B→Y1 Y2……Yn ,若B及每一个Yi ,都属于VN1∪VT ,则将B→Y1 Y2……Yn,放入P1中。
其次,对以给文法G[S],若执行算法2.2可得到一等价文法G’=(VN’, VT’ ,P’,S)使得对任一X∈VN’∪ VT’都存在α,β∈(VN’∪ VT’)有S=*>αXβ.
算法2.2: 1.分别置VN’、 VT’、P’为φ 2.将S 放入VN’中。 3.对于G中任何型如A→α1|……|αm的产生式,若A∈VN’则将α1……αm 中的全部非终结符放入VN’中,终结符放入VT’中。 4.重复③直至VN’、 VT’不增大为止。 5.将P中左右部仅含VN’∪ VT’中符号的所有产生式放入P’中。