编译原理
编译的概念
编译:将高级语言(源语言)翻译成汇编语言或**机器语言(目标语言)**的过程。
编译的过程
编译过程的五个阶段:
1)词法分析:识别出源程序中的一个个单词符号(词法单元:token<种别码,属性值>)
2)语法分析:从词法分析器输出的token序列中识别出各类短语,并构造语法分析树。
3)语义分析与中间代码生成: 语义分析——分析由语法分析器给出的语法单位的含义。中间代码:常用三地址码,记号系统,与机器指令较接近,易于转换成机器指令。
三地址指令序列唯一确定了运算完成的顺序。
4)优化:产生更高效的代码(对代码进行等价变换以求提高运行速度和节约存储空间)
①与机器无关的优化
②与机器有关的优化
5)目标代码生成:将中间代码变换成特定机器上的低级语言代码。
表格与表格管理 功能:管理各种符号表(常数、标号、变量、过程、结构……)
·查、填(登记、查找)源程序中出现的符号和编译程序生成的符号,为编译的各个阶段提供信息
·辅助语法分析、语义分析等
·完成静态绑定、管理编译过程
Hash表、链表等各种查、填表技术
错误处理 (词法错误、语法错误、语义错误):编译程序应报告出错地点,并给出简明准确的提示信息
学习内容
编译的遍
遍(PASS):对输入文件(源程序或其等价的中间形式)从头到尾扫描一遍,并完成预定处理工作的过程。
输入文件–>遍–>输出文件
·除了第一遍的输入是源程序外,其他各遍扫描的输入均是上一遍扫描的输出。
·遍可以和阶段相对应,也可以无关
·扫描多少遍需要统筹考虑
编译程序的设计目标
翻译程序有编译程序(效率高、笔译)和解释程序(跨平台但效率低、口译(java:编译+解释))。
·正确性
·完备性
·可维护性
·可移植性
编译程序生成
表示语言翻译的T形图
表示语言:编译程序本身是一个程序,所以它是用某种语言描述的,称之为编译程序的“表示语言”。
·自展、滚雪球
·移植:交叉编译
利用编译程序自动生成器
词法分析器的自动生成程序----LEX
语法分析器的自动生成程序----YACC
程序设计语言及文法
语言概述
·交换信息的工具——功能性描述
·自然语言:人与人之间通讯工具、难以形式化
·计算机语言:计算机系统间、人机间通讯工具、易于形式化
·形式化就是能够用一套基于明确定义的数学概念的*符号(数学语言)*来书写
·机器要“掌握规则”:形式化描述
1.高度抽象
2.方便计算机表示
3.严格的理论基础
Chomsky定义了文法的形式,来形式化的描述语言。
·无穷语句的有穷描述、便于计算机处理
基本概念
字母表
·字母表ε是一个**有穷非空**符号集合
符号:字母、数字、标点符号……
相当于高级语言的基本字符表
eg.二进制字母表:{0,1}、ASCII字符集、Unicode字符集
字母表上的运算![在这里插入图片描述](https://img-blog.csdnimg.cn/04abe6d2ea8d4ad3970b236345a09268.png)
![](https://img-blog.csdnimg.cn/1fd8e26bbedc4f5a8ab2df65356d0480.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdy5zbg==,size_20,color_FFFFFF,t_70,g_se,x_16)
字母表的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文法都是无二义性的
回溯
同一非终结符的多个候选式存在共同前缀,将导致回溯现象(发现不匹配,需要回退)
左递归
如
左递归的消除
将间接左递归变为直接左递归,消除直接左递归
方法
提取左因子
通过改写产生式来推迟决定,等读入足够多的输入,再做选择
总结实现自顶向下分析的文法要求
·无二义性
·不含左递归
·最好没有回溯问题