这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的很棒呢,看比尔盖茨那年龄都写出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′是等价的.
由于有事,不能够继续写,这是一,待续。后面将着重讲应用以及做的一些题目,二义性、简化、相互转化以及程序设计实践需要考虑的问题和代码书写。