软件设计师必备——编译原理·文法

        最近的软考,我看视频的过程中!发现有很多内容是在自考的过程中已经接触过得,且占到了80%的比例!但是有一部分内容,是我比较陌生的部分,需要研究研究,在这里,将我研究的内容整理分享给大家!


编译原理:

        首先,我第一眼看到他的时候,觉得这是个特神秘的科学知识!里面应该有很多难点,但是,我的愿望达到了,前两次看书都有点云里雾里的感觉,但是随着接触的深入,视频,书籍,网络三方面的共同攻击下,这个神秘的东西,变得不神秘了!

       编程语言的发展,我们不过多介绍,想了解的,可以去看这个网站“编程语言发展历史”,我们都明白到今天我们使用java这个第三代编程语言,可以使用人类熟悉的思维方式编程,中间我们走过了很多,而编译原理,我们可以这么简单理解:

        最早的没有现在意义上的编译器,以前人们直接面对计算机编码,是靠打孔器打纸带编程。大型机靠读纸带执行程序。

        由于机器语言由0、1组成,难以阅读。所以在机器语言的基础上开发了汇编语言。由于汇编语言还是很难使用,所以开发出高级语言。也可以预见,第一个高级语言编译器是由汇编语言编写的。

         而编译恰恰是这个过程的逆过程,我们看一张表:

软件设计师必备——编译原理·文法_第1张图片

        这就是编译原理的基本过程,中间码就是近似的汇编语言,而目标程序就是机器可识别的0和1


文法:

        就像我们写博客一样,我们写出来的东西要想共同交流,必须按照一定的格式去写,我用英语的格式写没有学过英语的人,就像看天书一样,汇编中的文法,和此类似,我们要按照一定的规则进行词法分析和语法分析,而其中的依据之一就是今天的主角文法!

        我们知道,代码到0和1之前,基本上都是一些字符组成的有意义的语句,而编译就是将他们一步步拆解成计算机能理解的语句的过程,这里就衍生出一个概念,就是终结符合非终结符!

        终结符:在程序中已经不可拆解,语句的含义到此为止,表现形式:字母小写
        非终结符:在程序中还可以可拆解,语句包含多重意思,表现形式:字母大写


        而我们将文法分级,就是为了让计算机判断,我们的语句分解到什么程度了,或者他是个什么结构的语句


0型文法

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


        补充:0型文法包含1,型文法,1型文法包含2,型文法,2型文法包含3型文法


总结

       文法和我们已经解除的知识,其实还是有很多联系的,比如我们没学一门语言,我们发现,基础的内容都大同小异,不同的只是书写代码的格式不同,我们称之为语法,而我们判断这是java写的代码还是c#写的代码,有时候有些困难,而文法就是规定一系列的格式,只要是这个格式组成的,就是java写的代码,这么说,编译的文法,是一种标准,按照标准来的,就是我们要求的东西!这么说,是不是很好理解了呢?

你可能感兴趣的:(java,设计模式)