编译原理笔记整理

基础

机器语言,二进制码:

C067 0000 0002 // 把0002的值放到地址0000处
// C067 操作码
// 0000 地址
// 0002 值

引入助记符:(形成汇编语言)

MOV X 2 // 等效

高级语言:

X = 2

汇编:将汇编语言翻译为机器语言
编译:将高级语言翻译为汇编语言(或者机器语言)

源程序翻译为目标程序的过程:

  1. 预处理器:源程序被分割在不同的文件中,需要预处理器整合;把'宏'翻译为(替换)为定义的语句
  2. 编译器:经过预处理器处理的程序,翻译为汇编语言
  3. 汇编器:生成可重定位的机器语言,使用的是相对位置,可以放在内存中执行
  4. 链接器/加载器:相对位置+在内存的起始位置=绝对位置,可运行的目标机器代码;链接库文件在这一步,库文件即是可重定位的程序
    (附注:除了内部地址,还有外部地址,使用外部地址即可调用外部程序)

词法分析/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)
posted @ 2025-12-16 00:26  北纬31是条纬线哦  阅读(2)  评论(0)    收藏  举报