编译程序 和 解释程序
编译过程
从上图可知,可以不执行的有:
- 中间代码生成
- 代码优化
符号表管理 和 出错处理
整个过程中,都有 符号表管理 和 出错处理 参与
词法分析
输入:源程序
过程:从左到右逐个扫描源程序中的字符,识别其中如关键字(或称保留字)、标识符、常数、运算符以及分隔符(标点符号和括号)等。
输出:记号流
错误分析:非法字符,关键字或标识符拼写错误,变量名以数字开头
语法分析
输入:单词符号(也就是上一步的输出)
过程:根据语法规则将单词符号分解成各类语法单位,并分析源程序是否存在语法上的错误
错误分析:语法结构出错,if endif 不匹配,缺分号、括号不匹配、表达式缺少操作数
分析方法
- 自顶向下分析法
- 递归下降分析法
- 预测分析法
- 自底向上分析法
- 移进-规约分析法
语义分析
主要检查源程序是否存在 静态语义错误,并收集类型信息共后面的代码生成阶段使用。
符号表:记录源程序各个符号的必要信息,以辅助语义的正确性检查和代码生成。
分类:
静态语义分析:语法制导翻译,将语言结构的语义以属性的形式赋予代表此结构的文法符号,而属性的计算以语义规则的形式赋予文法的产生式。
错误分析:运算符和运算类型不匹配(字符串之间用-减号);对浮点数取余动态语义分析: 程序运行时进行分析
动态错误
发生在 程序运行时,也叫 动态语义错误
错误分析:陷入死循环、变量值是零时做除数、引用数组元素下标越界等错误
静态错误总结
编译时所发现的程序错误
分为:
- 词法错误
- 语法错误
- 静态语义错误
中间代码(可以不执行)
由于源程序与目标程序的逻辑结构往往差别很大,想要 一次翻译到位很困难,而用语法制导翻译往往会 生成繁琐低效 的目标代码
因此必须采用一些中间代码,将原程序先翻译成中间代码形式,以利于进行与机器无关的优化处理,有助于提高编译程序的可移植性。
共同特征是:与具体的机器无关。
(考点)常用的中间代码有:后缀式(逆波兰式)、树型表示、三元式、四元式
四元式的形式为:(运算符,运算对象1,运算对象2,运算结果)
代码优化(可以不执行)
对前阶段的中间代码变换或改造,目的是使生成的代码更高效,节省时间和空间。
注意:可以不执行
目标代码生成
编译器工作的最后阶段,把代码转换为特定机器上的绝对指令代码、可重定位指令或汇编指令代码,这个阶段与具体的机器密切相关。
题
将编译器的工作过程划分为词法分析、语义分析、中间代码生成、代码优化和目标代码生成时,语法分析阶段的输入是()。若程序中的括号不配对,则会在()阶段检查出该错误。
A、记号流
B、字符流
C、源程序
D、分析树
A、词法分析
B、语法分析
C、语义分析
D、目标代码生成
分析
第一问:上面有总结过,语法分析阶段的输入是 记号流
第二问:上面有总结过,括号不配对,则会在 语法分析 阶段检查出该错误
参考:
https://blog.csdn.net/Lzy410992/article/details/117248279
https://zhuanlan.zhihu.com/p/495842473


