个人认为编译原理对于一个程序员来说很重要,可能你认为编程的时候用的都是C++、C#、Java等高级语言,至于编译原理懂与不懂并无大碍。其实不然,所谓万变不离其宗,所有高级语言的诞生都是基于最根本的编译原理的。搞懂了编译原理,对于一个程序员的能力提升有着很大的帮助。因为它会让你对编程有更加深刻的理解,有助于你写出质量更高的代码。好废话不多说,切入正题!

本文主要说一下编译原理里的文法、正规式、有穷自动机和语法推导树。

文法


文法就是计算机语言的一个严格的规范,有点类似人类语言的语法。就像形容词修饰名词,副词修饰形容词跟动词类似,只不过计算机的文法的标准和规范更加的严格而已。

文法的表达式:G=(Vn,Vt,P,S)  Vn是非终结符的集合,Vt是终结符的集合,P是推导式的一个集合,S是开始符。

文法中有三种符号和四种文法类型:

三种符号为:开始符——S;非终结符——A、B、C、AB等;终结符——a、b、c等。其实说白了开始符就是Start的缩写,非终结符就是大写字母或大写字母的组合(开始符S也是非终结符),终结符就是小写字母或小写字母的组合。

文法共分为四种,即0型文法——短语文法;1型文法——上下文有关文法;2型文法——上下文无关文法;3型文法——正规文法。

四个文法类的定义是逐渐增加限制的,即每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是短语文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。

注意:除0型文法以外,每一种文法都必须符合上一种文法。


0型文法:

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

通俗的解释:即产生式左边至少有一个大写字母,右边随意。

1型文法:

书中的定义:设G=(VN,VT,P,S),若P中的每一个产生式α→β均满足|β|≥|α| ,仅仅S→ε除外,则文法G是1型文法。

通俗的解释:即产生式左边的字母个数必须大于等于右边的字母个数。

2型文法:

书中的定义:设G=(VN,VT,P,S),若P中的每一个产生式α→β满足:α是一非终结符,β∈( VN∪VT )*则此文法称为2型文法。

通俗的解释:即产生式左边必须完全都是大写字母。

3型文法:

书中的定义:设G=(VN,VT,P,S),若P中的每一个产生式的形式都是A→aB或A→a,其中A和B都是非终结符,a是终结符,则G是3型文法。

通俗的解释:即所有产生式右边要么没有大写字母,如果有必须全部在小写字母右边或者全部在小写字母左边也就是要保持线性一致。

正规式

正规式是由正规文法转换而来,它们之间的转换规则共有三条:

规则1:正规文法(A—>xB,B->y ),正规式(A=xy)。这点很简单,用小学的数学知识就可以解决!如:A=xB,B=y,那么A=xy。

规则2:正规文法(A—>xA|y),正规式(A=x*y)。这是一个递归,它其实是——正规文法(A—>xA,A—>y),因为A—>xA,而右边的A又可以有A—>xA,所以就可以无限循环下去,最终还是要有结尾的,要不就没法表示了,所以有A=x*y,表明有无穷个x并以y结尾。

规则3:A—>x,A->y。那么A=x|y。这个就很简单了,不过多解释了。

其实上面说的那些话完全可以用下面一个表来代替,简单而又明了,哈哈!

有穷自动机跟语法推导树留到下一篇博客再为大家讲解吧!敬请期待!

深入浅出说编译原理(一)相关推荐

  1. 深入浅出编译原理-3-词法分析器

    引言 编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列.自此,此法分析器的工作就算完 ...

  2. 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?

    "编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...

  3. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化

    Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...

  4. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  5. 对学习编译原理的看法

    我认为编译原理这本书是一门与代码做斗争的课程,学习编译原理能够追寻程序设计语言的本质,了解计算机各种语言编译的原理.学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理,能使自己更加容易更加好 ...

  6. 《OpenMP编译原理及实现技术》摘录

    内容摘自<OpenMP编译原理及实现技术>第2章 代码测试环境:Windows7 64bit, VS2010, 4核机. 可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenM ...

  7. 编译原理(六)自底向上分析之LR分析法

    自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...

  8. 编译原理上机实习c语言小子集编译程序的实现报告,编译原理上机实习指导书(2015-11修改).pdf...

    <编译原理上机实习>指导书 一.上机实习目的 理解编译程序的构造原理,掌握编译程序的构造方法与技术.通过实习,使学生既加深对 编译原理基础理论的理解,又提高动手能力,特别是提高软件设计能力 ...

  9. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

最新文章

  1. Python中的标识符有哪些基础原则?
  2. MySQL和java连连看_用 JAVA 开发游戏连连看(之一)动手前的准备
  3. H5Stream播放RTSP流视频
  4. Java开发语句和代码块模板
  5. 第一次在Linux服务器上部署项目,看完这篇轻松应对
  6. 使用postman发送json数据报错400
  7. attribute关键字
  8. yum源安装php报错缺少libmcrypt.so.4()(64bit)库
  9. docker基础用法
  10. SAP Spartacus产品转盘页面(ProductCarousel)的产品数据批量加载实现细节
  11. unbantu上python安装步骤_如何在Ubuntu中安装Python 3.6?
  12. mysql 注入 file load_Mysql注入中into outfile和load_file()总结
  13. Oracle数据库(三)
  14. gcc可以编译python程序吗_GCC编译C语言程序完整演示
  15. C# 实体类序列化与反序列化一 (XmlSerializer)
  16. 使用TortoiseSVN将文件回退到某个版本
  17. AI算法 - 粒子滤波
  18. 最近,京东AR又爆出哪般神奇?
  19. 【SRAM】CubeMX配置STM32H743+IS61WV204816外部扩展SRAM
  20. uwb定位系统,室内定位技术

热门文章

  1. php7安装event拓展
  2. 在Centos 6.5 上面配置 SVN
  3. 点击按钮取GridView当前被操作行的数据
  4. 初学FF(火狐)的扩展(Extensions)
  5. MATLAB报错:未定义函数或变量
  6. 蓝桥杯基础训练——Fibonacci数列
  7. 七段式svpwm和5段式的区别_五段和七段SVPWM的比较分析.pdf
  8. python实现树有多少种方法_教程 | 从头开始:用Python实现决策树算法
  9. cygwin nginx php mysql_Windows 下 Nginx + PHP5 的安装与配置
  10. 转子接地保护原理_罗茨鼓风机(压缩机)原理和操作规程