-
编译的过程
词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
首先进行词法分析,将源程序处理为记号流,交由语法分析处理;语法分析识别各种语法成分并检查语法正确性,形成分析树; -
编译程序和解释程序的区别
翻译程序:将源程序处理转换为目标程序的程序,将一种程序设计语言翻译成等价的另外一种程序设计语言,比如C++等;
解释程序:直接解释执行源程序的程序,不生成目标程序,同时处理源程序和数据,一边处理一边运行,比如Python。 -
错误处理
词法分析:检测非法字符错误。
语法分析:发现记号流不符合语法规则的错误。
语义分析:检测具有正确语法结构,但对所涉及的操作无意义的结构。
代码生成:发现目标程序区超出了允许范围的错误。 -
词法分析:把构成源程序的字符串转换为语义上关联的记号序列。
作用:扫描源程序字符流、按照词法规则识别出各类单词符号、产生用于语法分析的记号序列、词法检查、创建符号表、跳过空白注释等 -
语法分析:编译程序的核心工作
输入:记号流
依据:源语言的语法规则
功能:从源程序记号序列识别出各类语法成分、进行语法检查
输出:分析树
常用分析方法:自顶向下、自底向上 -
自顶向下方法
递归调用分析法、非递归调用方法LL(1):要求不能有左递归
LL(1)就是最左推导 -
自底向上分析法
一般步骤:写出自动机、构造文法分析表、进行文法分析
LR(k)分析法:自底向上分析法。LR(0)就是最右推导。
简单的LR方法 SLR:在LR分析技术中能力最弱、最容易实现的一种方法。不存在移进-归约冲突
规范的LR方法 LR(1):功能最强、代价最大。相对于SLR,用向前搜索符替代follow集
向前看的LR方法 LALR:对同心集进行合并。
SLR(1)只能用于存在移进-规约冲突和规约-规约冲突的文法中对应的FOLLOW集合交集为空。