编译程序
跳到导航
跳到搜索
https://www.bilibili.com/video/BV1hg411V7Bm?p=49
1)编译过程
编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言程序或机器语言程序)。
编译程序的工作过程可以分为6个阶段,如图所示,实际的编译器中可能会将其中的某些阶段结合在一起进行处理。
2)词法分析
词法分析:从左到右逐个扫描源程序中的字符,识别其中如关键字(或称保留字)、标识符、常数、运算符以及分隔符(标点符号和括号)等。
例:
VAR X,Y,Z: real;
X:=Y+Z*60;
词法分析:
(1)保留字 VAR | (2)标识符 X | (3) 逗号 , | (4)标识符 Y |
(5)逗号 , | (6)标识符 Z | (7)冒号 : | (8)标识符 real |
(9)分号 ; | (10)标识符 X | (11)赋值号 := | (12)标识符 Y |
(13)加号 + | (14)标识符 Z | (15)乘号 * | (16)整常数 60 |
(17)分号 ; |
3)语法分析
语法分析:根据语法规则将单词符号分解成各类语法单位,并分析源程序是否存在语法上的错误。
包括:语言结构出错、if...end if不匹配,缺少分号、括号不匹配、表达式缺少操作数等。
4)语义分析
语义分析:进行类型分析和检查,主要检测源程序是否存在静态语义错误。
包括:运算符和运算类型不符合,如取余时用浮点数。
X | real | 0 |
Y | real | 4 |
Z | real | 8 |
... | ... | ... |
5)出错处理
静态错误
- 编译时所发现的程序错误(编译正确的程序没有静态错误)
- 分为语法错误和静态语义错误
- 语法错误包含:单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误
- 静态语义分析:运算符与运算对象类型不合法等错误(比如浮点数取余)
动态错误
- 发生程序运行时(程序可通过编译)
- 也叫动态语义错误
- 陷入死循环、变量取零时做除数、引用数组元素下标越界等错误
考点1:编译程序过程
在对源程序进行编译的过程中,()是正确地顺序。
A、语义分析、语法分析、词法分析
B、语法分析、词法分析、语义分析
C、词法分析、语法分析、语义分析 √
D、词法分析、语义分析、语法分析
考点2:词法、语法和语义分析
编译过程中,词法分析不能()。
1、去除源程序中的注释
2、识别记号(单词、符号)
3、识别结构不正确的语句
4、识别含义不正确的语句
A、1、2
B、1、3
C、3、4 √
D、2、4
题目解析:3、4是语法分析,不是词法分析
考点3:出错处理
某C语言程序中有表达式x%m(即x被m除取余数),其中,x为浮点型变量,m为整型非0常量,则该程序在()时会报错,
A、编译 √
B、预处理
C、编辑
D、运行
该错误属于()错误。
A、逻辑
B、语法
C、语义 √
D、运行
题解:这是个静态语义错误,而静态语义错误是在编译时查出来