编译原理

编译原理

编译的概念

编译:将高级语言(源语言)翻译成汇编语言或**机器语言(目标语言)**的过程。

编译的过程

编译过程的五个阶段:
1)词法分析:识别出源程序中的一个个单词符号(词法单元:token<种别码,属性值>)
2)语法分析:从词法分析器输出的token序列中识别出各类短语,并构造语法分析树
3)语义分析与中间代码生成: 语义分析——分析由语法分析器给出的语法单位的含义。中间代码:常用三地址码,记号系统,与机器指令较接近,易于转换成机器指令。
三地址指令序列唯一确定了运算完成的顺序。
4)优化:产生更高效的代码(对代码进行等价变换以求提高运行速度和节约存储空间)
①与机器无关的优化
②与机器有关的优化
5)目标代码生成:将中间代码变换成特定机器上的低级语言代码。
编译程序结构框图
表格与表格管理 功能:管理各种符号表(常数、标号、变量、过程、结构……)
·查、填(登记、查找)源程序中出现的符号和编译程序生成的符号,为编译的各个阶段提供信息
·辅助语法分析、语义分析等
·完成静态绑定、管理编译过程
Hash表、链表等各种查、填表技术
错误处理 (词法错误、语法错误、语义错误):编译程序应报告出错地点,并给出简明准确的提示信息

学习内容

编译的遍

遍(PASS):对输入文件(源程序或其等价的中间形式)从头到尾扫描一遍,并完成预定处理工作的过程。
输入文件–>遍–>输出文件
·除了第一遍的输入是源程序外,其他各遍扫描的输入均是上一遍扫描的输出。
·遍可以和阶段相对应,也可以无关
·扫描多少遍需要统筹考虑

编译程序的设计目标

翻译程序有编译程序(效率高、笔译)和解释程序(跨平台但效率低、口译(java:编译+解释))。
·正确性
·完备性
·可维护性
·可移植性

编译程序生成

表示语言翻译的T形图

在这里插入图片描述
表示语言:编译程序本身是一个程序,所以它是用某种语言描述的,称之为编译程序的“表示语言”。
·自展、滚雪球
·移植:交叉编译

利用编译程序自动生成器
词法分析器的自动生成程序----LEX
语法分析器的自动生成程序----YACC

程序设计语言及文法

语言概述

·交换信息的工具——功能性描述
·自然语言:人与人之间通讯工具、难以形式化
·计算机语言:计算机系统间、人机间通讯工具、易于形式化
·形式化就是能够用一套基于明确定义的数学概念的*符号(数学语言)*来书写
·机器要“掌握规则”:形式化描述
1.高度抽象
2.方便计算机表示
3.严格的理论基础

Chomsky定义了文法的形式,来形式化的描述语言。
·无穷语句的有穷描述、便于计算机处理

基本概念

字母表

·字母表ε是一个**有穷非空**符号集合
符号:字母、数字、标点符号……
相当于高级语言的基本字符表
eg.二进制字母表:{0,1}、ASCII字符集、Unicode字符集

字母表上的运算在这里插入图片描述

字母表的n次幂:长度为n的字符串构成的集合字母表的正闭包:长度正数的符号串构成的集合字母表的克林闭包:任意符号串(长度可以为零)构成的集合

串是字母表中符号的一个*有穷序列*
在这里插入图片描述
空串是长度为0的串,用ε表示
|ε|=0

串上的运算

连接

·如果x和y是串,那么x和y的连接是把y附加到x后面而形成的串,记作xy
·空串是连接运算的单位元,即,对于任何串s都有εs=sε=s
·单位元是集合里的一种特别的元,当它和其它元素结合时,并不会改变那些元素,若ae=a,e称为右单位元,若ea=a,e称为左单位元,若ae=ea=a,e称为单位元。
设x,y,z是三个字符串,如果x=yz,则称y是x的前缀,z是x的后缀。

在这里插入图片描述
串s的n次幂:将n个s连接起来

文法的定义

程序设计语言——形式化内容的提取
·字符(Character)
·单词(Token):满足词法规则的字符串
·语句(Sentence):满足语法规则的单词序列
·程序(Program):满足语法规则的语句序列
·程序设计语言:所有程序的集合

表示语言需要的四个要素

·非终结符,称为语法成分,不会出现在语句中
·开始符号
·终结符
·规则、产生式

文法的形式化定义

在这里插入图片描述四元组
·Vt:终结符集合。终结符文法所定义的语言的基本符号,字母表
·Vn:非终结符集合。非终结符是用来表示语法成分的符号,有时也成为**“语法变量”**
·P:产生式集合。产生式描述了将终结符和非终结符组合成串的方法
产生式的一般形式:α->β 读作:α定义为β
在这里插入图片描述
·S:开始符号。该文法中最大的语法成分。S∈Vn

推导和归约
句子和句型

一个句型中既可以包含终结符,有可以包含非终结符,也可能是个空串。
句子是不包含非终结符的句型。

文法的分类

0型文法
在这里插入图片描述

1型文法
在这里插入图片描述
CSG中不包含空产生式

2型文法
在这里插入图片描述在这里插入图片描述

3型文法(正则文法)
在这里插入图片描述

CFG的分析树

·推导的图形化表示

边缘(产出)

叶结点的标号既可以是非终结符也可以是终结符。从左到右排列叶节点得到的符号串成为是这棵树的产出或边缘。

(句型的)短语
给定一个句型,其分析树的每一棵子树的边缘成为该句型的一个短语。
直接短语

如果子树只有父子两代节点,那么这棵子树的边缘成为该句型的一个直接短语。

二义性文法
如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的。

·消歧规则

二义性文法的判定

对任意一个上下文无关文法,不存在一个算法,判定它是无二义性的,但能给出一组充分条件,满足这组充分条件的文法是无二义性的。
满足条件—>无二义性的
不满足—>无法判断

词法分析

词法分析(扫描)器的功能

功能:输入源程序,输出(单词)单词符号(token)。
即,把构成源程序的字符串转换成(单词)符号序列
单词符号的形式(token的形式)
·按照最小的语义单位设计
·通常表示为二元组:(单词符号种别,属性值)
单词符号表示(单词符号种别,属性值)
·种别
单词类型 种别码
关键字 一次一码
标识符 多词一码
常量 一型一码
运算符 一词一码 or一型一码
界限符 一词一码
在这里插入图片描述

单词的描述:词法的表示(RG,RE,FA)

在这里插入图片描述

正则表达式(RE/正规式)

对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”。用来表达对字符串的一种过滤逻辑。

正则语言的另一种描述,它更紧凑。
·运算优先级:*,连接,|
·()指定优先关系

定义

正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式r定义(表示)一个语言,记为L(r)。这个语言也是根据r的子表达式所表示的语言递归定义的。
在这里插入图片描述

C语言无符号整数的RE

`可以用RE定义的语言叫做正则语言或正则集合
RE代数定理
·|具有交换律、结合律
·“连接”具有结合律和对|的分配律
r+=rr*=r*r

正则定义
给一些RE命名,并在之后的RE中像使用字母表中的符号一样使用这些名字。

在这里插入图片描述

正则文法与正则表达式

正则表达式与正则文法等价
对任何正则文法G,存在定义同一语言的正则表达式r
对于任何正则表达式r,存在生成同一语言的正则文法G

正则表达式与正则文法的转换

在这里插入图片描述

有穷自动机(FA)

是正则语言的另一种等价描述
FA定义的语言

由一个有穷自动机M接收的所有的串构成的集合称为是该FA定义(或接收)的语言。记为L(M).

定义与分类

在这里插入图片描述

转换函数

DFA:
从状态s出发,沿着标记为a的边所能到达的状态
NFA:
从状态s出发,沿着标记为a的边所能到达的状态集合

转换表
状态/输入

NFA转换表:
在这里插入图片描述

nfa和dfa具有等价性,可以识别相同的语言

在这里插入图片描述

带有空边的nfa与不带空边的nfa具有等价性

词法分析阶段的错误处理

类型
单词拼写错误
非法字符
输入信息为空,未达终态,则调用**错误处理程序**
错误处理

·查找已扫描字符串中最后一个对应于某终态的字符
·找到,将该字符与其前面的字符识别成一个单词。然后将输入指针退回到该字符,扫描器重新回到初始状态,继续识别下一个单词
·没找到,确定出错,采用错误恢复策略

错误恢复策略

·最简单的错误恢复策略:“恐慌模式”恢复
·从剩余的输入中不断删除字符,直到词法分析器能够在剩余输入的开头发现一个正确的字符为止

词法分析器的设计与实现

实现过程

语法分析

检查扫描器输出的单词序列是否符合该语言的文法CFG——组成句子,并分析组成此句子的语法成分

输入:token序列
输出:
语法成分及组成
表现形式:语法树
错误报告

自顶向下的语法分析

·从分析树的顶部(根节点)向底部(叶节点)方向构造分析树
·可以看成是从文法开始符号S推导出词串w的过程

最左推导

总选择每个句型的最左非终结符进行替换

在这里插入图片描述
最左推导 对应 最右归约

最右推导

总选择每个句型的最右非终结符进行替换
最右推导 对应 最左归约

自底向上的分析中:规范归约为最左归约 规范推导为最右推导
自顶向下的语法分析采用的是最左推导的方式

最左推导和最右推导都具有唯一性

语法分析方法

推导/派生 自顶向下 (文法产生语言)
归约 自底向上 (自动机识别语言)

自顶向下的语法分析面临的问题

二义性

改造方法

引入语法变量,使文法含有更多的信息
LL文法和LR文法都是无二义性的

回溯

同一非终结符的多个候选式存在共同前缀,将导致回溯现象(发现不匹配,需要回退)

左递归

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

左递归的消除

将间接左递归变为直接左递归,消除直接左递归
方法

在这里插入图片描述
在这里插入图片描述

提取左因子

通过改写产生式来推迟决定,等读入足够多的输入,再做选择

在这里插入图片描述

总结实现自顶向下分析的文法要求

·无二义性
·不含左递归
·最好没有回溯问题
候选式的确定与回溯

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值