写在BLOG之前
博客内容为个人学习笔记,主要来自于下面书籍:
书名:编译原理
作者:〔美〕Alfred V.Aho(著);〔美〕Ravi Sethi(著);〔美〕Jeffrey D.Ullman(著);李建中;姜守旭
出版社:机械工业出版社·北京
编译分为两部分:分析与综合。
分析部分将源程序切分为一些基本块并形成源程序的中间表示,综合部分把源程序的中间表示转化为所需的目标程序。
1.分析
在分析期间,源程序所蕴含的操作被确定并表示为一个称为语法树的分层结构,节点表示操作,节点的子节点表示操作的参数。
源程序的分析阶段:
1.线性分析。从左到右读构成源程序的字符流,且把字符流分组为多个token。(token为具有整体含义的字符序列)
2.层次分析。字符串或token被划分为具有一定层次的多个嵌套组,单个嵌套组具有某一整体性含义。
3.语义分析,判断程序各个组成部分确实是有意义组合在一起。
2.综合
从概念上讲,编译器是分阶段执行的,每个阶段将源程序从一种表示转换成另一种表示。
(1)编译的多个阶段可以分为前端与后端两块内容。
前端一般包括词法分析、语法分析、符号表的建立、语义分析、中间代码生成和相关的错误处理。
后端主要包括代码优化、代码生成以及相关错误处理和符号表操作。
(2)编译器的编
编译的若干阶段通常是以一遍来实现的,每遍读取一次输入文件,产生一次输出文件。
在操作中,我们希望编译的遍数越少越好。然而将多个阶段合成一遍,则我们不得不将这些阶段的整个程序保存在内存中,造成空间浪费。
由此产生算法中常见的时间与空间问题。