自学编译原理(一)——概述
自学编译原理(一)——概述
-
编译器的大体结构
编译程序是一个设计分析和综合的复杂系统。它通常由词法分析器、语法分析器、语义分析与中间代码生成器、代码优化器、目标代码生成器、出错处理器、符号表管理器组成。
-
词法分析概述
主要任务 从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型,并将识别出的单词转换成统一的机内表示——词法单元(token)形式
token: <种别码,属性值>
token类别单词类型 种别 种别码 关键字 program if else then … 一词一码 标识符 变量名 数组名 记录名 过程名 … 多词一码 常量 整型 浮点型 字符型 布尔型 … 一型多码 运算符 算数(+ - * / ++ –) 关系(> < == != >= <=) 逻辑(& ~) 界限符 ; ( ) { } … 一词一码 -
语法分析概述
主要任务 语法分析器(parser)从词法分析器输出的tokken序列中识别出各类短语,并构造语法分析树(parse tree)
语法分析树描述了句子的语法结构 -
语义分析概述
主要任务
- 收集标识符的属性信息
- 种属(kind) 简单变量 复合变量(数组 记录 …) 过程 …
- 类型(type) 整型 字符型 布尔型 指针型 …
- 存储位置 长度
- 值
- 作用域
- 参数和返回信息
收集到的属性信息存在符号表中
- 语义检查
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 数组下标不是整数
- 对非数组变量使用数组访问操作符
- 对非过程名使用过程调用操作符
- 过程调用的参数类型或数目不匹配
- 函数返回类型有误
- 收集标识符的属性信息
-
中间代码生成及编译后端概述
中间表示形式 三地址码 语法结构树/语法树
三地址码由类似于汇编语言的指令序列组成 每个指令最多有三个操作数
三地址指令的表示
四元式(op, y, z, x)
学习过程依照中国大学MOOC上哈工大开设的编译原理一课,参考书籍《编译原理》(蒋宗礼 姜守旭 编著)。