最近软测试。我观看进程的视频!
发现里面有很多内容已经在自我不错的接触过程。而占80%比例!
但其中的一部分。我很奇怪的一部分。研究,在这里,将我研究的内容整理分享给大家!
编译原理:
首先,我第一眼看到他的时候。认为这是个特神奇的科学知识!
里面应该有非常多难点。可是。我的愿望达到了,前两次看书都有点云里雾里的感觉。可是随着接触的深入,视频,书籍,网络三方面的共同攻击下,这个神奇的东西,变得不神奇了。
编程语言的发展。我们只是多介绍。想了解的,能够去看这个站点“编程语言发展历史”。我们都明确到今天我们使用java这个第三代编程语言,能够使用人类熟悉的思维方式编程,中间我们走过了非常多,而编译原理。我们能够这么简单理解:
最早的没有如今意义上的编译器,曾经人们直接面对计算机编码,是靠打孔器打纸带编程。大型机靠读纸带运行程序。
因为机器语言由0、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编写代码。所以。编译语法,是一个标准。按照标准,我们问什么是。所以,这不是它的一个很好的理解?
必要的软件架构师——编译原理·语法