编译原理笔记整理
基础
机器语言,二进制码:
C067 0000 0002 // 把0002的值放到地址0000处
// C067 操作码
// 0000 地址
// 0002 值
引入助记符:(形成汇编语言)
MOV X 2 // 等效
高级语言:
X = 2
汇编:将汇编语言翻译为机器语言
编译:将高级语言翻译为汇编语言(或者机器语言)
源程序翻译为目标程序的过程:
- 预处理器:源程序被分割在不同的文件中,需要预处理器整合;把'宏'翻译为(替换)为定义的语句
- 编译器:经过预处理器处理的程序,翻译为汇编语言
- 汇编器:生成可重定位的机器语言,使用的是相对位置,可以放在内存中执行
- 链接器/加载器:相对位置+在内存的起始位置=绝对位置,可运行的目标机器代码;链接库文件在这一步,库文件即是可重定位的程序
(附注:除了内部地址,还有外部地址,使用外部地址即可调用外部程序)
词法分析/Scan
关键字(if, else, while...)
标识符(变量名、数组名...)
常量(const )
运算符(算数 + - * / 关系运算符 == >= != 逻辑运算符 && || ~)
界限符(; {} () (){};)
语法分析:生成语法分析树
语义分析:
// 语义检查:
变量或过程未经声明就使用
变量或过程名重复声明
运算分量类型不匹配(整性和浮点型计算,编译器会把整性转换为浮点型)
操作符与操作数之间类型不匹配,如下
// 数组下标不是整数
// 对非数组变量使用数组访问操作符
// 对非过程名使用过程调用操作符
// 过程调用的参数类型或数目不匹配(参数列表)
// 函数返回类型有误
语义分析结果可用三地址指令/四元式表示:
x = y op z (op ,y,z,x)
x = op y (op ,y,_,x)
x = y (= ,y,_,x)
if x relop y goto n (relop,x,y,n)
goto n (goto ,_,_,x)
param x (param ,_,_,n)
call p, n (call ,p,n,_)
return x (return,_,_,x)
x = y[i] (=[] ,y,i,x)
x[i] = y ([]= ,y,x,i)
x = &y (& ,y,_,x)
x = *y (=* ,y,_,x)
*x = y (*= ,y,_,x)

浙公网安备 33010602011771号