编译原理
初识
- 编译:将高级语言翻译成汇编语言或者机器语言的过程
- 汇编:是把汇编语言翻译为机器语言
我们无时无刻不和编译器打着交道,不论是什么ide编写代码都会经过编译这一环节
预处理器:当用高级语言编写代码的时候,可能分为了很多的不同的模块,而预处理器在处理用高级语言编写的源程序的时候,会将存储在不同文件的不同模块的源程序汇聚到一起,将被称为‘宏’的缩写语句转换为原始语句
可重定位:在内存中的存放的
起始位置L
不是固定的(没有意义需要加载到合适的位置赋予意义就是一段码)起始位置+相对地址=绝对地址
,代码中的所有位置都是相对于这个起始位置加载器:修改可重定向地址,将修改后的指令和数据放在内存中适当的位置
连接器:一个大型的程序可能会与其他重定向程序或者库文件连接,而链接器是将多个可重定向的机器代码文件包括库文件链接到一起,解决外部地址的问题
1.编译器的结构
- 前端是从字符流加载进来的所以只是与源程序相关
- 后端是在中间表示的基础上生成目标代码,所以只与目标有关
2.词法分析
-
扫描出源程序的字符,识别出各个单词,确定单词的类型转化为词法单元的形式
-
token<种别码,属性值> 而程序的种别类型分为 关键字,标识符,常量,运算符,界限符;而这之中最特殊的是标识符是由开发人员自己编写的所以不能确定具体是什么所以多个标识符对应一个种别码 🌰如果num1 = 2,num3=3;这之中num2和num2都是标识符可以用 <IDN, num1>和<IDN,num2> 表示 -
分析树
赋值语句的分析树🌰x = y+z ;
``` 赋值语句— —— ——; / | \ / = \ 左边只有一个标识符 表达式(一整个大的表达式) x / \ / \ 表达式 表达式 | | 标识符 标识符 y z ```
文法
2型文法是:上下文无关文法 表示一个非终结符由(V.n U V.t)*组成
3型文法是:正规文法,有限自动机,其中右边要么是终结符号或串如果有非终结符要么在左边或者右边(右线型文法或者左线型文法)注意只是非终结符不是非终极符号串
文法用G表示 G=(V.t,V.n,P,S)
而V.t:终结符集合是一个字母表
终结符是文法所定义的语言的基本符号,有时候又叫做token,一个句子的终结符是单词
V.n 非终结符集合是一个字母表
是用来表示语法成分的符号,有时候也称为“语法变量” 一个句子的非终结符是{<句子>,<名称短语等等>}
文法符号集合也是一个字母表就是V.t并V.n
产生式
描述了将终结符和非终结符组合成串的方法产生式的一般形式是 A—>B
A属于(V.t U V.n)+,且a中至少包含Vn中的一个元素,称为产生式的头部或者左部
B属于(V.t U V.n)*
语言的形式化定义
- 由文法G的开始符号推导出的所有句子构成的集合称为文法G生成的语言,记住L(G)
字母表
一个有穷字符集:记为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nonGNkCi-1653033970612)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220516173748013.png)] (x代表前面)字母表中的每一个元素称为字符
字符串也叫做字是指x中字符所构成的一个有穷的序列,不包含任何字符的序列称为空字,x*代表字的全体
53033970612)] (x代表前面)字母表中的每一个元素称为字符
字符串也叫做字是指x中字符所构成的一个有穷的序列,不包含任何字符的序列称为空字,x*代表字的全体