第一章
编译器:编译器就是一个程序,它读入用某种语言编写的源程序,并翻译成一个与之等价的另一种语言编写的源程序。
编译程序的工作过程的五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
各阶段的任务:
* 词法分析任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词。
* 语法分析任务:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。
* 语义分析与中间代码产生任务:对语法分析所识别出的各类语法范畴,分析其含义并进行初步翻译。
* 优化阶段任务:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。
* 目标代码生成任务:把中间代码变换成特定机器上的低级语言代码。
程序语言主要由语法和语义两方面定义。
语法:
词法规则:合法单词构成的规则,用有限规则自动机或者正规式描述。
语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(用上下文无关文法进行描述)
语义描述方法:属性文法和基于属性文法的语法制导翻译方法。
单词符号:是语言中具有独立意义的最基本结构
一般包括:常数,标识符,基本字、算符和界符
例:0.5是一个实型常数
=是赋值符号
程序设计语言的定义:建立在有限字母集之上的一个符号系统,有一定的语法和语义规则。
高级语言分类
* 强制式语言(过程式语言)
* 应用式语言:注重程序所表示的功能,而不是一个语句接一个语句地执行。
* 基于规则的语言:检查一定的条件,当它满足值,则执行适当的动作。
* 面向对象语言:封装,继承,多态。
根据编译时是否需要类型检查分为:
* 静态类型语言(c,c++,java):在编译时,便需要确定类型的语言。即写程序时需要明确声明变量类型。
* 动态类型语言(Python, Ruby,PHP):在运行时,确定类型的语言。即编译时与类型无关。
根据检查类型强弱分为:
* 强类型语言(JAVA, C#)
* 弱类型语言(C,C++,VB)
程序结构分为:
* 支持过程的嵌套定义
* 不支持过程的嵌套定义
数据类型分为:
* 基本数据类型(int,char,float,double)
* 构造数据类型(指针,静态数组,动态数组)
* 自定义数据类型(栈,队列,字符串,结构体)
第二章
字母表:由若干元素组成的有限非空集合,用∑表示,它的每个元素称为一个符号。
符号串: 由∑中的符号所构成的有穷序列。
符号串的前缀和后缀及子串:设x是一个符号串,将x的尾(前)部删掉几个字符后形成的符号串,称为x的前(后)缀;从一个
号串中删去他的一个前缀和后缀后所剩下部分称为x的子串
空字:不包含符号的序列称为空字,记为ε。
符号串集合的运算
符号串的连接运算:设x和y是两个符号串,如果将y直接拼接在x之后,称这种操作为符号串的连接。
符号串的方幂:一个符号串与其自身的n-1的任意连接称为次符号串的n次幂,记作:xn。 特别地:x0=ε。
字符串集合的和(等价于集合的并运算):设A、B是两个符号串的集合,则将集合A、B的和记为A+B或A 并B,定义为。
上下文无关文法
文法是描述语言的语法结构的形式规则(即语法规则)
上下文无关文法的特点:它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。
特点:独立性
缺点:不能用来描述自然语言
一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)
开始符号是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴。
产生式(也称为产生规则或简称规则)是定义语法范畴的一种书写规则。
一个产生式的形式是 A→ α
其中箭头左边的A是一个非终结符,称为产生式的左部符号;
箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部,或称候选式。
最左(最右)推导:在推导的任何一步α->β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换
语法分析树与二义性
1.语法树的根结由开始符号所标记。
2.随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结点。每个新结点
其父亲结点间都有一条连线。
3.在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。
例如对于文法 E→E+E|E*E|(E)|i, 关于(i*i+i)的推导形成语法树如图
语法树有不唯一性,如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。
也就是说,若一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是法是二义的。关于文法二义性的几个问题:
1.文法二义不等于语言二义
2.文法的二义性是不可判定的
3.文法的二义性证明:找出一个句子,它有两个不同的最左推导或最右推导
4.文法二义性的消除:给每个产生式定义优先级
消除文法二义性的方法:定义优先级和结合性,引入新的非终结符,建立新的产生式。
形式语言鸟瞰:
* 0型文法(短语文法)
* 1型文法(上下文有关文法)
* 2型文法(上下文无关文法)
* 3型文法(右/左线性文法)
学习文法有助于我们能更好理解程序语言。
ε |