`
心动音符
  • 浏览: 328920 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

什么是0型文法,1型文法,2型文法,3型文法?

阅读更多
乔姆斯基把方法分成四种类型,即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型文法。

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

Ps:
看了上面的文法的解释,终于有点明白了什么是文法.在这里记下了.但我想不出这个文法有啥用啊,不知道大家有没有懂的指点一二.
虽然问题有点BT,但本小姐打算今年过软设没着得搞会它啊,
.
分享到:
评论
12 楼 piao_bo_yi 2010-08-31  
linliangyi2007 写道
yangit11 写道
to 楼上
不是没人做,是因为已经有了,没有必要做了
而且主要是国内重效率,多于质量。

更更重要的是os不是一个人能做出来的,要不微软咋吃饭啊

unix最初也是个内核是一个人做的

现在的话搞os感觉哪怕能优化linux的一个小部分就已经很了不起了


按你的这种说法,只要外国人做了,中国人就拿来用好了。那还谈什么自主产权,悲哀啊~~


大家做不出来的时候,也就只能这么自己安慰自己了。
11 楼 linliangyi2007 2010-03-05  
yangit11 写道
to 楼上
不是没人做,是因为已经有了,没有必要做了
而且主要是国内重效率,多于质量。

更更重要的是os不是一个人能做出来的,要不微软咋吃饭啊

unix最初也是个内核是一个人做的

现在的话搞os感觉哪怕能优化linux的一个小部分就已经很了不起了


按你的这种说法,只要外国人做了,中国人就拿来用好了。那还谈什么自主产权,悲哀啊~~
10 楼 Jen 2010-03-05  
yangit11 写道
to 楼上
不是没人做,是因为已经有了,没有必要做了
而且主要是国内重效率,多于质量。

更更重要的是os不是一个人能做出来的,要不微软咋吃饭啊

unix最初也是个内核是一个人做的

现在的话搞os感觉哪怕能优化linux的一个小部分就已经很了不起了


那么外国人都是白痴啊?搞了一个又一个语言和操作系统
9 楼 check 2010-02-26  
rink1969 写道
考试的时候不会很难的,一般就是简单的自动机,或者判断给定文法属于哪个类型的文法。
四种文法从上到下是包含关系,注意下一级同上一级的差别,倒着推一下就行了。

至于文法有什么用?好像还真涉及的不多……
编译原理里面词法分析会用到3型文法,语法分析会用到上下文无关文法。
因为程序语言都很简单
只有真实的语言才会用到上下文相关文法吧~~

我一直也很疑惑,0型文法是对应图灵机所能接受的所有的语言
但是后面3种文法为什么是这些限制应该有什么原因吧?期待大牛解答……

一开始猜测1型文法是能判定停机的所有语言?不过仔细想想好像也不是……


不大习惯0,1,2,3的提法,大致说一下

所谓的3型,即Finite Automata,不需要记忆任何状态,只根据输入进行状态转移。

2型则对应Pushdown Automata,唯一依靠的记忆是栈。

1型的数学意义多于实际意义

回到你提到的限制原因,FSM的实现可以不依赖任何存储设备,只要用硬件搭建好状态就可以,所有这样能够解决的问题,自然需要一个集合来描述,即正则语言。而同样,增加一个栈可以解决的问题的语言,可以用CFG来描述。再复杂的才是图灵机的现实模拟。当然复杂的可以用来模拟简单的,程序设计语言里的正则支持你可以理解为一个帮助你建立简单模型的支持,而不是倒为本末,困惑为什么有了更高级的我们还需要功能更弱的。
8 楼 yangit11 2010-02-25  
to 楼上
不是没人做,是因为已经有了,没有必要做了
而且主要是国内重效率,多于质量。

更更重要的是os不是一个人能做出来的,要不微软咋吃饭啊

unix最初也是个内核是一个人做的

现在的话搞os感觉哪怕能优化linux的一个小部分就已经很了不起了
7 楼 linliangyi2007 2010-02-23  
楼主精神可嘉,中国就少这种对基础认真学习的,以至于至今没有自己的操作系统和编程语言。
6 楼 rink1969 2010-02-23  
呵呵,不要打击楼主mm
软件设计师还是有点技术含量的,考的不是很深,但是覆盖面够广
不知道现在怎么样,当年能考过的还是比较少的

我当年考的时候,一开始复习,看论坛上都说编译原理这块最好放弃
等复习最后确实有时间的时候再临时看一下
所以我就是考试前一天晚上,用了两个小时找了本书看了一下,没想到第二天的题目竟然都做出来了

后来也是基本忘的差不多了
现在是因为工作需要,所以又开始看……
5 楼 wdpyyxal 2010-02-23  
这些大学的编译原理都快全部还给老师了
4 楼 yilv99 2010-02-23  
花这么多时间去过软设。。。。浪费青春
3 楼 rink1969 2010-02-22  
额……有些概念没弄的很清楚……

在wiki上看到一个表格:
自动机理论: 形式语言和形式文法
乔姆斯基层级 文法 语言 极小自动机
类型 0         无限制 递归可枚举 图灵机
n/a       (无公用名) 递归 判定器
类型 1       上下文有关 上下文有关 线性有界
n/a        附标 附标 嵌套堆栈
n/a        树-邻接 适度上下文有关 嵌入下推
类型 2       上下文无关 上下文无关 非确定下推
n/a   确定上下文无关 确定上下文无关 确定下推
类型 3         正则 正则 有限

看了一些资料,文法貌似有很多种
从这个表格看来乔姆斯基谱系不是一个严格的类型划分,因为各种类型之间还能插进去别的文法。
他这个类型的划分除了包含关系就没有别的什么更深层原因了?
是不是就是随便分的,或者是从实际应用中总结出来的?
不知道上面的表格是不是列全了?还能不能再插进去别的文法?
2 楼 night_stalker 2010-02-20  
<p><strong>3 型文法</strong> 对应我们常见的正则表达式,译成“正则文法”比“正规文法”要好一点。<br>正则表达式用一行非递归规则就能写出来,不能递归引用自己,不能表达嵌套结构。(不过 PERL 的正则表达式比较强大,是接近 2 型文法的存在)<br><br>lex 或者 StringTokenizer 都可以对应到一个 3 型文法的产生规则。<br><br><strong>2 型文法 </strong>(上下文无关文法)很容易被误会成“没有上下文”。它的“上下文无关”指的是每个产生式规则的展开都和上下文无关,但是不能说它没有上下文。<br><br>它的一个重要特点是“括号嵌套”,只要括号的开始和终结符都在同一条规则中,它产生的字符串的括号就是嵌套的。譬如它可以产生一族包含 [] 和 () 正确嵌套的字符串:<br>{"(a[(b)]c)", "(a)[b]", ...}<br><br><strong>1 型文法</strong> (上下文有关文法)的括号是可以违背嵌套规则的。譬如它可以产生一族开括号和闭括号数目相等,但不一定正确嵌套的字符串:<br>{"(a([b)]c)", "(a[)b]", ...}<br><br>---------------------------------------------------------------<br><br>事实上,语法书里展开规则基本都是上下文无关的,<strong>人类语言结构绝大部分都能表示为上下文无关文法</strong>。<br><br>譬如 wiki 的例子:<br>(John, (whose (blue car) (was (in the garage)), (walked to the (green store)).<br><br>只有极其少数的句子是上下文相关文法的,而且看起来也会有点怪:<br>[ John saw a (blue car in an ad yesterday] with bright yellow headlights).</p>
<p> </p>
<p>---------------------------------------------------------------</p>
<p> </p>
<p>0 1 2 3 型都是停机可判定的 …… 因为 “递归可枚举” 的意思就是存在一个图灵机,它可以将一个文法规则能辨认的所有的字符串从短到长,一个一个不带重复的举出来。那么可以构造另一个图灵机,它一个个枚举可辨认的字符串和输入相比较,如果匹配就返回成功,如果枚举字符串长度大于输入就返回失败,总会停机的 —— 故停机可判定。</p>
<p> </p>
<p> 0 型文法就是图灵机停机可判定的边界,0 型文法再往上的才是停机不可判定的。</p>
<p> </p>
<p>---------------------------------------------------------------</p>
<p> </p>
<p>补充: 一般来说一个计算机语言的语法是停机可判定的,即你写出来的程序要么编译成功,要么语法错误。(运行时停机问题是不可判定的,不讨论)。但是 <a href="http://www.perlmonks.org/?node_id=663393">Perl 5 的语法是停机不可判定</a> 的,写成编译器的话,不管怎么修改编译器,都存在一个源文件,让编译器无法判断它是否存在语法错误 ……</p>
1 楼 rink1969 2010-02-20  
考试的时候不会很难的,一般就是简单的自动机,或者判断给定文法属于哪个类型的文法。
四种文法从上到下是包含关系,注意下一级同上一级的差别,倒着推一下就行了。

至于文法有什么用?好像还真涉及的不多……
编译原理里面词法分析会用到3型文法,语法分析会用到上下文无关文法。
因为程序语言都很简单
只有真实的语言才会用到上下文相关文法吧~~

我一直也很疑惑,0型文法是对应图灵机所能接受的所有的语言
但是后面3种文法为什么是这些限制应该有什么原因吧?期待大牛解答……

一开始猜测1型文法是能判定停机的所有语言?不过仔细想想好像也不是……

相关推荐

    1型文法两种定义的等价性

    证明了乔姆斯基谱系中1型文法(上下文相关文法)两种定义形式的等价性。

    编译原理试题

    1.什么是S-属性文法?什么是L-属性文法?它们之间有什么关系? 解答: S-属性文法是只含有综合属性的属性文法。 (2分) L-属性文法要求对于每个产生式AX1X2…Xn,其每个语义规则中的每个属性或者是综合属性,...

    LL(1)型文法分析编译原理的做的

    LL(1)型文法分析编译原理老师布置的作业 对大家做实验有用

    文法分析 编译原理

    3) 整理文法的结构,判断该文法的文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法,文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非...

    LL(1)文法判断程序

    1. 实验内容 1、 让计算机接受一个文法,示例如(仅供参考): G[S] 为: ...2、 编程实现对上述文法是否是LL(1)文法的判断,是则给出肯定回答,否则给出否定回答。 3、判别是否是LL(1)文法 。。。。。。

    LL(1)文法的判别以及非LL(1)文法的转换(完整可运行代码)

    本程序的所用的存储结构都是string...最终有三种结果,一种是是LL(1)文法,一种是不是LL(1),但是经过转换变成了LL(1),还有一种是经过转换也无法变成LL(1)。 输入文本格式样例: A A-&gt;ad A-&gt;Bc B-&gt;aA B-&gt;bB

    编译原理LL(1)文法设计

    (1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止; (2)输入已知文法,由程序自动生成它的LL(1)分析表; (3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。 2.分析 ...

    LL(1)文法判定器

    根据判断一个文法是LL(1)文法的三个条件,逐一实现其判别条件的算法实现。 满足是LL(1)文法的三个条件: (1)文法不含有左递归 (2)对于文法中每一个非终结符A,若它存在某个候选首符 集两两不相交,即,若A→α1|α2|...

    Chomsky文法类型判断及消除文法的左递归.txt

    (p[i].right.length()==1||p[i].right.length()==2)||(p[i].right[0]&gt;='A'&&p[i].right[0])) //右部字符个数不是1或2,或首字符是非终结符 { flag++; break; } else if((p[i].right.length()==2)&&!(p[i]....

    LL(1)型文法的判断、求first集、FOLLOW集、select集、LL(1)文法判别、构造预测分析表、非LL(1)文法转换

    给定一个上下文无关文法,判断其是否为 LL(1)型文法。如果不是,尝试是否 可以改写为 LL(1)文法。 覆盖知识点:FIRST 集、FOLLOW 集、SELECT 集、预测分析表的构建、消除左递归、 消除左公共因子。 求first集、...

    LR0文法分析器

    LR(0)文法分析器(LR (0) grammar parser)对于实现整个编译器而言,语法分析器是整个过程的核心部分,同时对构造整个编译器起到了关键作用,对程序的进一步扩展,以后有机会涉及对编译器的编写而言,将会是很容易便...

    计算机网络技术资料计算机网络技术重点知识结构 在计算机网络技术的学习、考试、应用中都有很好的帮助

    1.文法G属于chomsky哪一型文法? 2.给定符号串,判定该符号串是不是该文法的一个句子,请证实。 3.若是句子,写出该句型的所有短语、简单短语,以及句柄。 4.构造识别该文法的活前缀的DFA。 5.判断该文法是LR(0)...

    LL型文法编译器源代码.c语言写

    该文件可运行LL(1)文法的判断过程,并可直接运行给出详细的过程

    c0文法编译器示例

    这是一个c0文法的编译器示例

    编译原理实验判断文法是不是LL1文法

    用C语言编写实现编译原理实验判断文法是不是LL1文法的程序。程序简单易懂,且基本功能都实现了。

    C++版LL(1)文法分析

    是编译原理的实习,关于LL(1)的文法分析程序,鄙人的拙手作品,多多谅解!

    编译原理实验八:非LL(1)文法到LL(1)文法的转换

    编译原理实验八:非LL(1)文法到LL(1)文法的转换,zip文件里包含实验报告和源代码两部分。

    LR(0)文法

    通过构造文法的有限自动机(DFA),得出LR(0)分析表和分析程序,并且能够判别字符串是否属于当前文法,内含C++源代码和实验报告说明

    3型文法的介绍ppt

    讲述关于编译原理里的3型文法,里面也有相关例子。

Global site tag (gtag.js) - Google Analytics