版权声明:本文为博主原创文章,转载需标明出处 https://blog.csdn.net/Jason_yesly/article/details/84204623
编译的本质是一个翻译的过程,编译的输入是一个高级语言程序,输出是汇编语言程序或者机器语言程序。
过程:
词法分析/扫描(Scanning)
词法分析的主要任务:
从左向右逐行扫描源程序的字符,识别出各个单词,确认单词的类型
.
将识别出的单词转换成统一的机内表示–词法单元(token)
形式
token:<种别码,属性值>
种别码:单词的词性
单词类型 | 种别 | 种别码 |
---|---|---|
关键字 | program、if、else、then… | 一词一码 |
标识符 | 变量名、数组名、记录名、过程名… | 多词一码 |
常量 | 整型、浮点型、字符型、布尔型… | 一词一码 |
运算符 | 算术(+ - * / ++ --)关系(> < != == <=)逻辑(& ~) | 一词一码或一型一码 |
界限符 | ; ( ) = { }… | 一词一码 |
语法分析(parsing)
语法分析器(parser)从词法分析器分析输出的token序列中识别出各类短语,并构造语法分析树(parse tree)
语义分析
语义分析主要任务:
- 收集标识符的属性信息
- 种属(Kind)
- 简单的变量、复合变量(数组、记录。。)、过程。。。
- 类型(Type)
- 整型、实型、字符型、布尔型、指针型。。
- 存储位置、长度
- 变量的值
- 过程的作用域
- 参数和返回信息
- 参数个数、参数类型、参数传递方式、返回值类型。。。
以上信息都会存放在符号表
中
- 参数个数、参数类型、参数传递方式、返回值类型。。。
- 种属(Kind)
- 语义检查
- 变量或过程
未经声明就使用
- 变量或过程名
重复使用
运算分量
类型不匹配
- 变量或过程
文法
字母表(Alphabet)
-
字母表 是一个有穷符号集合
- 符号:字母、数字、标点符号。。。
-
串
文法的定义
G=(Vt,Vn,P,S)
- Vt:终结符集合
终结符(terminal symbol)
是文法所定义的语言的基本符号
,有时也成为token- 如:Vt={girl,boy,look,like}
- Vn:非终结符集合
非终结符(nonterminal) 是用来表示语成分的符号,有时也称为“语法变量”- 如:Vn={<句子>,<名词短语>,<动词短语>,<名称>…}
注意:
1. Vt、Vn相交为空集
2. Vt、Vn相并表示 文法符号集
- P:产生式集合
产生式(production)
描述了将终结符和非终结符组合成串的方法。
产生式的一般形式:
graph LR
a-->B
读作:a定义为B
-
- S: 开始符号
S属于Vn。开始符号(start symbol)
表示的是该文法中最大的语法成分
符号约定
- 终结符
- 字母表中
排在前面的小写字母
,如:a、b、c 运算符
,如:+、* 等标点符号
,如括号、逗号数字
,0、1、…9粗体字符串
,如:id、if等
- 字母表中
- 非终结符
- 字母表中
排在前面的大写字母
,如:A、B、C - 字母S。通常表示开始符号
小写、斜体的名字
,如:expr、_stmt_等代表程序构造的大写字母
,如:E(表达式)、T(项)、F(因子)
- 字母表中
- 字母表中
排在后面的大写字母
,如:X、Y、Z
表示文法符号
(即终结符或非终结符) - 字母表中
排在后面的小写字母
(主要是 u,v、、、z)
表示终结符号串
(包括空串
) 小写希腊字母
,表示文法符号串
(包括空串
)