计算机编译原理---文法

乔姆斯基把方法分成四种类型,即0型、1型、2型和3型。这几种文法类型的概念一定要掌握,是一个非常重要的考点。对于这几种文法,一般书上都只有简单的

概念介绍,比较抽象,所以很多学员都没有真正理解。下面我将把概念结合例题进行讲解。

0型文法

设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G是一个0型文法。0型文

法也称短语文法。一个非常重要的理论结果是:0型文法的能力相当于图灵机(Turing)。或者说,任何0型文语言都是递归可枚举的,反之,递归可枚举集必定是

一个0型语言。0型文法是这几类文法中,限制最少的一个,所以我们在试题中见到的,至少是0型文法。

1型文法

1型文法也叫上下文有关文法,此文法对应于线性有界自动机。它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。

注意:虽然要求|β|>=|α|,但有一特例:α→ε也满足1型文法。

如有A->Ba则|β|=2,|α|=1符合1型文法要求。反之,如aA->a,则不符合1型文法。

2型文法

2型文法也叫上下文无关文法,它对应于下推自动机。2型文法是在1型文法的基础上,再满足:每一个α→β都有α是非终结符。如A->Ba,符合2型文法要求。

如Ab->Bab虽然符合1型文法要求,但不符合2型文法要求,因为其α=Ab,而Ab不是一个非终结符。

3型文法

3型文法也叫正规文法,它对应于有限状态自动机。它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。

如有:A->a,A->aB,B->a,B->cB,则符合3型文法的要求。但如果推导为:A->ab,A->aB,B->a,B->cB或推导为:A->a,A->Ba,B->a,B->cB则不符合3型方法的要求

了。具体的说,例子A->ab,A->aB,B->a,B->cB中的A->ab不符合3型文法的定义,如果把后面的ab,改成“一个非终结符+一个终结符”的形式(即为aB)就对了

。例子A->a,A->Ba,B->a,B->cB中如果把B->cB改为B->Bc的形式就对了,因为A→α|αB(右线性)和A→α|Bα(左线性)两套规则不能同时出现在一个语法中,

只能完全满足其中的一个,才能算3型文法。

注意:上面例子中的大写字母表示的是非终结符,而小写字母表示的是终结符。

讨论上下文有关语法(context-sensitive grammar)和0型语法(type-0 grammar)。

我们首先讨论上下文有关语法。

上下文有关语法的重写规则P的形式为

φ→ψ,

其中,φ和ψ都是符号串,并且要求|φ|≤|ψ|,也就是ψ的长度不小于φ的长度。

现在有一种形式语言L={anbncn},它是由n个a,n个b和n个c相互毗连而成的符号串,并且要求n≥1。生成这种语言的语法G是:

G = {Vn, Vt, S, P}

Vn = {S, B, C}

Vt = {a, b, c}

S = S

P:

S → aSBC                 ①

S → aBC                  ②

CB → BC                   ③

aB → ab                   ④

bB → bb                   ⑤

bC → bc                   ⑥

cC → cc                   ⑦

从S开始,用规则① n-1次,得到

S => an-1S(BC)n-1

然后,用规则②一次,得到

S => an(BC)n

规则③可以把(BC)n变换成BnCn。例如,如果n=3,则有

aaaBCBCBC => aaaBBCCBC => aaaBBCBCC => aaaBBBCCC,

这样,便有

S => anBnCn

接着,用规则④一次,得到

S => anbBn-1Cn

然后,用规则⑤n-1次,得到

S => anbnCn

然后,用规则⑥一次,得到

S => anbncCn-1

最后,用规则⑦n-1次,得到

S => anbncn

这就是我们要生成的形式语言。

这个语法的各个重写规则中,右边的符号数总是大于或者等于左边的符号数,满足条件

|φ|≤|ψ|

因此,这个语法是上下文有关语法。

Chomsky指出,上下文有关语法和上下文无关语法之间存在着如下的关系:

第一,每一个上下文无关语法都包含在上下文有关语法之中。

在上下文有关语法的重写规则φ→ψ中,φ和ψ都是符号串,当重写规则左边的符号串蜕化为一个单独的非终极符号A时,就有A→ψ,由于ψ是符号串,

因而可用ω代替,即得A→ω,这就是上下文无关语法的重写规则。

第二,存在着不是上下文无关语言的上下文有关语言。例如,Chomsky指出的不能用有限状态语法来生成的语言L3={αα},也不能用上下文无关语法来生成

。但是,它却可以用上下文有关语法来生成。生成语言L3的语法如下:

G = {Vn, Vt, S, P}

Vn = {S}

Vt = {a, b}

S = S

P:

S → aS                      ①

S → bS                      ②

αS → αα                     ③

在规则③中,α是集合{a, b}上的任意非空符号串,由于αS的长度不大于αα的长度,并且αS不是单个的非终极符号,而是符号串,所以,这个语法不可

能是上下文无关语法,而是上下文有关语法。

例如,形式语言abbabb可以这样来生成:从S开始,用规则①一次,得到S=>aS,用规则②两次,得到S=>abbS,用规则③一次,得到S=>abbabb。

可见,上下文有关语法的生成能力,比有限状态语法和上下文无关语法都强。但是,由于上下文无关语法可以采用Chomsky范式这种有力的手段来实现层次分

析,所以,在自然语言的计算机处理中,人们还是乐于采用上下文无关语法。

最后,我们来讨论0型语法(type-0 grammar)。

0型语法的重写规则是φ→ψ,除了要求φ≠ψ之外,没有任何别的限制。Chomsky证明了,每一个0型语言都是符号串的“递归可枚举集”(recursively

enumerable set);并且证明,任何一个上下文有关语言同时又是0型语言,而且还存在着不是上下文有关语言的0型语言。因此,上下文有关语言应包含于0型

语言之中,它是0型语言的子集合。

不过,因为0型语法的重写规则几乎没有什么限制,用于描写自然语言颇为困难,它的生成能力太强,会生成难以计数的不合格的句子。所以,在Chomsky的

四种类型的语法中,最适合于描述自然语言的还是上下文无关语法。这种语法,我国自然语言处理的学者习惯于把它叫做短语结构语法。

Chomsky的形式语言理论,对于计算机科学发生了重大的影响。Chomsky把他的四种类型的语法分别与图灵机、线性有界自动机、后进先出自动机和有限自动

机等四种类型的自动机(自动机是用来识别语言的抽象机器)联系起来,并且证明了语法的生成能力和语言自动机的识别能力的等价性的四个重要结果:

①若一语言能被图灵机识别,则它就能用0型语法生成,反之亦然。

②若一语言能被线性有界自动机识别,则它就能用上下文有关语法生成,反之亦然。

③若一语言能被后进先出自动机识别,则它就能用上下文无关语法生成,反之亦然。

④若一语言能被有限自动机识别,则它就能用有限状态语法生成,反之亦然。

Chomsky的上述结论,提供了关于语言的生成过程和语言的识别过程的极为精辟的见解。这对于计算机程序语言的设计、算法分析、编译技术、图象识别、人

工智能等,都是很有用处的,在自然语言处理中,也发挥了巨大的作用。

时间: 2024-08-27 00:11:39

计算机编译原理---文法的相关文章

关于计算机编译原理

从我个人理解,计算机编译原理,顾名思义,就是关于计算机编程翻译的相关原理,即对计算机编程的,更为深入.更为详细的去解读计算机语言.上网看了许多个人解读编译原理,发现最令我信服的,就是把编译原理类比成人体解剖:只有认真解剖.研究人体各部位,才能在手术中.医治中做到更好的处理.因此,唯有理解编译原理,才能更好地进行计算机的编程等一系列的操作. 博客上有人说到,学习编译原理能够更加容易理解算法之间的关系.能培育自己的观点.提高学习语言的效率.但在我个人看来,学好编译原理,能让我们有一个更强的临时变换的

计算机编译原理

程序设计语言是为了书写计算机程序而认为设计的符号语言,用于对计算机过程进行.描述.组织和推导.程序语言的发展是一个不断 演化的过程,根本的推动动力是更高的抽象机制以及对程序设计思想的更好地支持. 一.程序设计的概念 计算机程序设计语言是一个不断发展的过程,是一个由低级语言到高级语言的发展过程.计算机的硬件只能够识别0/1组成的机器指令序列,即机器指令程序,因为机器指令是最基本的计算机语言.后来产生的汇编语言也是一种机器语言.后来人们越来越聪明,在以前的基础上开发了功能更加强大的.抽象级别更高的语

编译原理文法知识通俗趣味理解

在正式介绍文法的知识之前,先来看一下西天取经团队成员的文法定义,以便对文法有个感性认识. 1.      <西天取经团队成员>::=<师父>|<徒弟成员> 2.      <师父>::= “唐僧” 3.      <徒弟成员>::=”孙悟空”|”猪八戒”|”沙和尚”|”白龙马” 不用我多解释,大家也知道上面文法的含义吧.西天取经团队成员是师父或徒弟,师父是“唐僧”,徒弟成员是”孙悟空”.”猪八戒”.沙和尚”或”白龙马”. 问大家一个问题,西天取经

编译原理——算符优先分析文法(附源代码)

算符优先分析文法 一.写在前面 算符优先分析文法是一种工具,在编译的过程中,隶属于语法分析环节,却又与中间代码的生成息息相关,编译可以分为五个阶段:词法分析.语法分析.语义分析(中间代码的生成).代码优化.目标代码生成.语法分析是指:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语.子句.句子.程序段.程序),并确定整个输入串是否构成语法上正确的程序.也就是说语法分析是检验输入串的语法是否正确,注意这里的语法正确,只是简单地符合自己定义的规范,而不能检测出运行时错误,比如"X/0&

编译原理之形式语言文法分类

高级程序设计语言的三个基本因素: 语法:描述语言成分的构成规则(包括词法规则和语法规则) 语义:描述语法成分的含义 语用:描述语法成分的使用方法 形式语言理论(formal language theory)是用数学方法研究自然语言(如英语)和人工语言(如程序设计语言)的产生方式.一般性质和规则的理论.形式语言是模拟这些语言的一类数学语言,它采用数学符号,按照严格的语法规则构成.从广义上说,形式语言是符号取自某个字母表的字符串的集合.如同自然语言具有语法规则一样,形式语言也是由形式文法生成的.一个

编译原理123

1.编译原理就是什么? 个人理解,编译就是像翻译一样,将一种语言翻译成另一种语言,编译就是将高级语言或汇编语言翻译成电脑能识别的二进制机器语言,编译原理就是讲解这 个编译的过程.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有 利于提高软件人员的素质和能力. 2.学习编译原理有什么好处? 学习编译原

编译原理之我见

经过网上的调查,我发现编译原理并不像我所想象的那样简单,我以为编译原理其实就是像塑造一个翻译师一样,赋予它翻译的架构即可,但是经过调查后,结果却不是我所想,编译原理就是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵守的规律,让电脑可以懂得高级语言所能表达的东西,内容包括语言和文法,词法分析,语法分析,语法制导编译,中间代码生成,存储管理,代码优化和目标代码生成.编辑原理是计算机专业的一门重要课,旨在介绍编译程序构造的一般原理和方法.编译原理及技术从本质上来讲就是一个算法问题而已,

学习编译原理

刚刚进入大二,初学习到编译原理,一门新的技术,而且学习起来会比较抽象,不过好在大一曾学习到VC这一门东西,在学习此门课程之前,已在网上了解到不少学习这门课该提前遇到道德东西,也了解到很多人学习这门课的问题,在他们的经验中知道了不少学习方法,希望自己能在日后中用得上.例如这个就觉得很不错:删繁就简,避重就轻.网上流传较广的一篇<编译原理学习导论>(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了

程序员的三大浪漫之一——编译原理

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为,既然编译过程是将一种语言翻译为另一种语言的计算机程序的过程,顾名思义,编译原理就是为我们解释计算机是如何将一种语言翻译成另一种语言这