1.绪论
1.1 编译程序的概念
回顾:程序设计语言及程序设计语言的处理方式(编译和解释)
编译程序:是指这样的程序,它能够把某种语言的程序转换成另一种语言的程序,而后者与前者在逻辑上是等价的。
编译程序的分类
根据不同的用途和侧重点:
诊断编译器:用于程序的开发和调试
优化编译器:具有优化能力,提高目标代码的效率
交叉编译器:该编译器产生不同于其宿主机的机器代码(就是在一个平台上生成另一个平台上的可执行代码。所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System))
宿主机:编写程序的计算机
目标机: 运行程序的计算机
1.2 编译过程概述
主要工作:
把高级语言写的程序翻译成等价的目标程序。
1.2.1 词法分析
主要工作
词法规则(正规式,有限状态自动机,正则表达式,3型文法等)
主要工作:
读入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词(也称单词符号,或简称符号,token),报告发现的词法错误(拼写错误)
源程序的格式化处理:删除无用的符号(空格、回车符等),删除注释语句
在词法分析阶段工作所依循的是语言的词法规则。描述词法规则的有效工具是正规式和有限自动机。
例:for (i=0;i<=30;i++) /* 循环语句*/
1.2.2 语法分析
语法:定义了语言各语法成分的形式或结构
语法分析的任务:在词法分析的基础上,根据语言的语法规则,把单词符号划分成各类语法单位(语法范畴),如“短语”、“句子”、 “子句”、“程序段”等,确定整个输入串是否构成语法上正确的程序。
语法规则通常用上下文无关文法(2型文法)描述。
简单的文法(Grammar):G=(VT,VN,S,P)
P: S->xAy
A->**|*
判断x*y是否是一个合法的语法范畴(语法单位)
通过构造语法树来实现
1.2.3 语义分析与中间代码的产生
语义:定义了各语法成分的功能和含义,即规定了语法单位的属性或在执行时应进行的运算。
语义:定义了各语法成分的功能和含义,即规定了他们的属性或在执行时应进行的运算。
这一阶段通常包括两方面的工作:首先对各种语法范畴进行静态语义检查,如果正确则进行另一方面的工作,即进行中间代码的翻译。
通常使用属性文法描述语义规则
2.高级语言及其语法描述
2.1 程序设计语言的定义
建立在有限字母集之上的一个符号系统
有一定的语法和语义规则
语法规则:词法规则和语法规则
语义规则:描述语法单位的功能和含义
一般用户:关心语言如何使用
编译器开发人员:关心文法的定义。他们对哪些构造允许出现更感兴趣。
语法:一组规则,用这组规则可以产生形式上正确的程序
2.1.2 语义
对于一个语言来说,不仅要给出它的词法、语法规则,而且要定义它的单词符号和语法单位的意义。这就是语义问题。
语义是指这样的一组规则,使用它可以定义一个程序的意义。
语义描述方法:属性文法和基于属性文法的语法制导翻译方法。
2.2 高级语言的一般特征
高级程序设计语言最基本的、共有的技术特征
(待更新)
与文法定义相关的几个概念和术语:
字母表:由若干元素组成的有限非空集合,用S表示,它的每个元素称为一个符号。
符号串: 由S中的符号所构成的有穷序列。
符号串的前缀和后缀及子串:设x是一个符号串,将x的尾(前)部删掉几个字符后形成的符号串,称为x的前(后)缀;从一个符号串中删去他的一个前缀和后缀后所剩下部分称为x的子串
空字:不包含符号的序列称为空字,记为e。
用S*表示S上的所有符号串的全体,空字也包括在其中。
f表示不含人何元素的空集{}。
分析e、{}和{e}的不同
符号串的连接运算:
设x和y是两个符号串,如果将y直接拼接在x之后,称这种操作为符号串的连接;
符号串的方幂:
一个符号串与其自身的n-1的任意连接称为此符号串的n次幂,记作:xn
特别地:x0= e
2.3.1 上下文无关文法
文法是描述语言的语法结构的形式规则(即语法规则)
上下文无关文法的特点
它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。
特点:独立性
缺点:不能用来描述自然语言
归纳起来,一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号(非终结符),以及一组产生式。
形式上定义一个上下文无关文法G是一个四元式
(VT,VN,S,P)