“编译程序”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (→4)语义分析) |
Jihongchang(讨论 | 贡献) (→4)语义分析) |
||
第75行: | 第75行: | ||
|} | |} | ||
[[文件:语义分析.png|无|缩略图]] | [[文件:语义分析.png|无|缩略图]] | ||
+ | |||
+ | |||
+ | === 5)出错处理 === | ||
+ | |||
+ | ==== 静态错误 ==== | ||
+ | |||
+ | * 编译时所发现的程序错误(编译正确的程序没有静态错误) | ||
+ | * 分为语法错误和静态语义错误 | ||
+ | * 语法错误包含:单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误 | ||
+ | * 静态语义分析:运算符与运算对象类型不合法等错误 | ||
+ | |||
+ | ==== 动态错误 ==== | ||
+ | |||
+ | * 发生程序运行时(程序可通过编译) | ||
+ | * 也叫动态语义错误 | ||
+ | * 陷入死循环、变量取零时做除数、引用数组元素下标越界等错误 |
2022年9月16日 (五) 06:53的版本
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)出错处理
静态错误
- 编译时所发现的程序错误(编译正确的程序没有静态错误)
- 分为语法错误和静态语义错误
- 语法错误包含:单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误
- 静态语义分析:运算符与运算对象类型不合法等错误
动态错误
- 发生程序运行时(程序可通过编译)
- 也叫动态语义错误
- 陷入死循环、变量取零时做除数、引用数组元素下标越界等错误