必要的软件架构师——编译原理·语法
最近软测试。我观看进程的视频!
发现里面有很多内容已经在自我不错的接触过程。而占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编写代码。所以。编译语法,是一个标准。按照标准,我们问什么是。所以,这不是它的一个很好的理解?
必要的软件架构师——编译原理·语法的更多相关文章
- 编译原理简单语法分析器(first,follow,分析表)源码下载
编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- python实现算术表达式的词法语法语义分析(编译原理应用)
本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...
- 【编译原理】c++实现自下而上语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 【编译原理】c++实现自上而下语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>
<编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...
- 【编译原理】LL1文法语法分析器
上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
- 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...
随机推荐
- 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...
- jquery中的选择器01
<!doctype html> <html> <head> <meta charset="gb2312"> <title> ...
- windows azure Vm、cloud service、web application 如何选择可用的服务
windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...
- SpringMVC+Spring+Hibernate的小样例
Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...
- CSS设计指南之浮动与清除
原文:CSS设计指南之浮动与清除 浮动意思就是把元素从常规文档流中拿出来,浮动元素脱离了常规文档流之后,原来紧跟在其后的元素就会在空间允许的情况下,向上提升到与浮动元素平起平坐. 一.浮动 CSS设计 ...
- J Dp
<span style="color:#000099;">/* ____________________________________________________ ...
- IntelliJ IDEA15开发时设置中java complier 的问题
Error:java: Compilation failed: internal java compiler error set中java complier 设置的问题 ,项目中有人用jdk1.6 ...
- Directx11学习笔记【二】 将HelloWin封装成类
我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...
- 【Nginx】磁盘文件写入飞地发
文章继续.什么时候Nginx当用户请求一个文件,这将无法读取该文件的内容加载到内存,然后从内存发送,但电话sendfile况下,从内核直接发送出去.这样做显然效率要更高.Nginx也为我们封装好了一系 ...
- Eclipse建筑物SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)相框-随着源代码
一直想自己搭建一个ssh框架,这次因为编写demo的须要,就亲手搭建了一下,并逐步測试!以下进入正题: 创建Struts项目 整合步骤: 1,在Eclipse中创建一个DynamicWeb Proje ...