这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的很棒呢,看比尔盖茨那年龄都写出BASIC 了,真是觉得与大牛差距太大,一定要追赶 ~~

将前一段时间学的编译原理重新回顾一下。也与大家分享一下学习资料。

翻译器:能够将一种语言转换成另一种语言的软件,而且后者与前者在逻辑上是等价的。

编译与解释的区别:

1.编译器:工作效率高,即时间快、空间省;交互性与动态特性差、可移植性差。大多数PL采用此种方法翻译

2.解释器:工作效率低,即时间慢、空间费;交互性与动态特性好、可移植性好。早期的Basic和现在的Java等。

编译的主要步骤和部分:

词法分析 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词。

单词:是高级语言中有实在意义的最小语法单位,它由字符构成。

词法分析依照词法规则,识别出正确的单词,转换成统一规格,备用。

描述词法规则的有效工具是正规式和有限自动机。

语法分析

任务:根据语言的语法规则,把单词流组成各类语法单位,如:短语、句子、过程、程序

语法规则:语言的规则,又称为文法;规定单词如何构成短语、语句、过程和程序。

语法规则通常用上下文无关文法描述。

语法分析有两种方法:

推导(Derive)和规约(Reduce)

语法分析过程也可以用一棵倒着的树来表示,这棵树叫做分析树

语义分析

任务:检查程序的语义正确性,以保证程序各部分能有意义的结合在一起,为以后的代码生成阶段收集类型信息

语义分析阶段的重要工作:类型检查

中间代码生成

任务:根据语义规则产生一种介于源语言与目标代码之间的一种中间代码。

中间代码是不依赖于机器但是又便于生成依赖于机器的目标代码的一种结构简单、含义明确的记号系统

中间代码形式

逆波兰式、 四元式、三元式

代码优化

任务:对前面产生的中间代码进行加工变换,以期在最后阶段能产生更为高效的目标代码。

原则:等价变换

主要方面:公共子表达式的提取、合并已知量、删除无用语句、循环优化等。

目标代码生成

任务:把经过优化的中间代码转化成特定 机器上的低级语言代码

目标代码的形式

绝对指令代码:可立即执行的目标代码。

汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能运行。

可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码。

这张图当时老师打错了,我看的时候主要集中在代码生成器的作用,也没有太仔细,根据 unique~ 网友的指正,后来看后面的汇编语言才发现错了,应该为

temp1:=id3*60.0

id1:=id2+temp1

在此表示感谢~!不过我们的老师可能是不小心打错的,她是这方面的资深研究员,大家可以不用怀疑其他理论部分,。

符号表管理

表格作用:用来记录源程序的各种信息以及编译过程中的各种状况。

与编译前四阶段有关的表格有:

符号表、常数表、标号表、分程序入口表、中间代码表等。

符号表:用来登记源程序中的常量名、变量名、数组名、过程名等,记录它们的性质、定义和引用情况。

错误诊断和报告

任务:如果源程序有错误,编译程序应设法发现错误,并报告给用户。

完成:由专门的出错处理程序来完成

错误类型:

语法错误:在词法分析和语法分析阶段检测出来。

语义错误:一般在语义分析阶段检测。

阶段的分组

编译前端:主要指与源语言有关,与目标语言无关的部分,通常包括词法分析、语法分析、语义分析和中间代码生成,与机器无关部分的代码优化

编译后端:指与目标机器有关的部分。如与机器有关的优化、目标代码生成

遍:对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。

要在某机器上为某种语言构造一个编译程序,必须掌握下面三个方面的内容:源语言  目标语言 编译方法

单词的描述机制——正规式

单词的识别机制——有限自动机

词法分析器

实现词法分析的程序

词法分析的任务:从左至右扫描源程序的字符串,按照词法规则识别出源程序中具有独立含义的最小语法单位——单词。

和用户接口的其他任务:

---滤掉注释和(由空格、制表符等引起的)空白

---某些预加工处理

2.1.1  串和语言

首先表述一些基本 术语和概念

---符号:一个抽象实体,是语言中最基本的不可再分的单位。例如字母是符号,数字也是符号。

---字母表:符号的非空有限集合,因此字母表也称为字符类或符号集。例:å = {0, 1}

---串:符号的有穷序列,例:00 11 10 是字母表S ={0, 1}上的符号串

---符号串的长度: 如果某符号串x中有m个符号, 则称其长度为m,表示为|x|=m,如    001110的长度是6。

正规式:又称正规表达式,是描述单词构造方法的一种形式化工具,每个正规式r表示一个语言L(r),正规式表示的语言叫正规集。

二者关系:正规式定义正规集,正规集构造正规式。

正规式的等价

不同算术表达式可以表示同一个数,如3+5、5+3、2+6等均表示8。不同正规式也可以表示同一个正规集,即正规式与正规集之间是多对一的关系。

正规式等价的判定:

利用正规式的等价性可以化简复杂的正规式。正规式的等价性判定可以采用两种方法:

---根据定义,证明不同的正规式表示同一集合

---根据下述正规式的代数性质进行运算

状态转换图

状态转换图是设计词法分析程序的一种好的途径。

结点代表状态,用圆圈○表示。

状态之间用箭弧→连结,箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。

一张转换图只包含有限个状态(即有限个结点),其中一个为初态,至少一个为终态(双圈表示)。

有 限 自 动 机(FA)

是一种识别装置,准确识别正规集

具有离散输入输出系统的数学模型。这种系统具有有限数目的内部状态,系统的当前状态概括了过去的输入处理的信息。系统只需要根据当前所处的状态和面临的输入字符就可以决定系统后继的行为。

有穷自动机分为两类:

确定的有穷自动(Deterministic Finite Automata)--DFA

不确定的有穷自动机(Nondeterministic Finite Automata)--NFA

DFA的确定性表现在:

对任何状态s ∈S,在读入了输入符号a ∈ Σ 之后,能够唯一地确定下一个状态

从状态转换图来看,若字母表Σ含有n个输入字符,那末任何一个状态结点最多有n条弧射出,而且每条弧以一个不同的输入字符标记。

DFA M对字符串的识别:对于Σ中的任何字符串α,若存在一条从初态结点到终态结点的通路,且这条通路上所有弧的标记符号连接成的串等于α。

若M的初态结点又是终态结点,则空字ε可为M所识别。

DFA M所能识别语言:能被DFA M所接受的字符串的集合,记为L(M).

对于任何两个有穷自动机M和M′,如果

L(M)=L(M′),则称M与M′是等价的.

由于有事,不能够继续写,这是一,待续。后面将着重讲应用以及做的一些题目,二义性、简化、相互转化以及程序设计实践需要考虑的问题和代码书写。

欢迎转载,转载请注明出处。本文出自:http://www.cnblogs.com/zdcaolei

0

编译原理学习笔记一(待续)相关推荐

  1. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  2. 编译原理学习笔记20——符号表

    编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...

  3. 编译原理学习笔记2——高级程序设计语言概述

    编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...

  4. 编译原理学习笔记 5.1 翻译文法和语法制导翻译

    前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 导言 一.翻译文法和语法制导翻译 输入文法 翻译文法 活动 ...

  5. 编译原理学习笔记 3.3 正则文法的状态图

    前言 参考东南大学廖力老师的编译原理教程和课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 状态图的画法(根据文法画出 ...

  6. 编译原理学习笔记 6.2 符号表的组织与内容

    前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 一.符号表的结构与内容 "名字"域 & ...

  7. 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言

    高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...

  8. 编译原理学习笔记(一)

    题目 已知一个不确定的有限自动机(NFA) (1)描述该NFA所识别语言的特点,列举两个可识别的串; (2)写出与该NFA等价的正规式; (3)将其确定化(即转换为与NFA等价的DFA); (4)使用 ...

  9. 【编译原理学习笔记】1:符号和符号串,文法和语言,文法的类型

    符号和符号串 字母表(符号集):元素的非空有穷集合. 符号:字母表中的元素. 符号串:由字母表中的符号组成的任何有穷序列. 头:如符号串z=xy中的x. 尾:如符号串z=xy中的y. 固有头:符号串的 ...

最新文章

  1. Swift Property Wrapper 属性包装器
  2. c# 4.0(vs2010)新特性一览
  3. php 数组 excel,PHPExcel文件如何导入成数组(选择指定的列)?
  4. 如何应对倒戈的员工?
  5. QTP自动化测试从零基础到精通进阶(脚本测试、VBS语法、描述性编程、测试框架)...
  6. SPSS单因素方差分析教程
  7. 高性能网络之shufflenet v2
  8. php 简易教学管理系统
  9. 微信公众号开通留言功能条件有哪些?
  10. Prolog编程学习(一)
  11. 美通社企业新闻汇总 | 2019.3.7 | 百胜中国在上海设创新中心;折叠手机2019年预计仅占智能手机市场渗透率0.1%...
  12. java 学习7.13 正则表达式 Pattern和Matcher类 Math类 Random类 System类 BigDecimal类 Date类 SimpleDateFormat类 Cale
  13. 网络正常连接,浏览器无法打开网页的解决方法
  14. 各地发布防病提示,秋冬不注意腹泻来敲门
  15. 转自goosman的编程开发心路历程
  16. 剑指XX游戏(六) - 轻松搞定面试中的红黑树问题
  17. normalize.css 类似,使用normalize.css遇到的问题?
  18. linux安装appt服务,Centos下pptd ***搭建
  19. Java进阶,Set集合,Map集合
  20. 微信公众号(二)扩展分享

热门文章

  1. 大型网站 linux,大型网站架构演变
  2. 解决springboot不扫描@repository的问题
  3. 13.文件:因为懂你,所以永恒
  4. OpenCV学习笔记大集锦
  5. java多线程系列(四)---ReentrantLock的使用
  6. Hadoop HDFS的一些相关代码code
  7. 在Ubuntu中安装HBase
  8. 鸟哥的Linux私房菜(基础篇)- 第十九章、认识与分析登录文件
  9. 阿里云自营建站买一年送一年
  10. html的进一步了解(更新中···)