编译原理一二章总结

第一章

编译器:编译器就是一个程序,它读入用某种语言编写的源程序,并翻译成一个与之等价的另一种语言编写的源程序。

编译程序的工作过程的五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

各阶段的任务:

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

* 语法分析任务:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。

语义分析与中间代码产生任务:对语法分析所识别出的各类语法范畴,分析其含义并进行初步翻译。

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

目标代码生成任务:把中间代码变换成特定机器上的低级语言代码。



程序语言主要由语法语义两方面定义。

语法:

词法规则:合法单词构成的规则,用有限规则自动机或者正规式描述。

语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(用上下文无关文法进行描述)

语义描述方法:属性文法和基于属性文法的语法制导翻译方法。

单词符号:是语言中具有独立意义的最基本结构
        一般包括:常数,标识符,基本字、算符和界符
       例: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型文法(右/左线性文法)



学习文法有助于我们能更好理解程序语言。




ε

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值