编译器工作流
解析(Parsing): 将最初原始的代码转换为一种更加抽象的表示即(AST);
转换(Transformation): 将对抽象的表示做一些处理,让它能做到编辑器期望它做到的事情
代码生成(Code Generation):接收处理之后的代码表示,然后把它转换为新的代码
- 解析
-
解析分为2个阶段,词法分析(Lexical Analysis)和语法分析(Syntactic Analysis)
词法解析: 接收原始代码,把它分割成一些被成为token的东西,这个过程是在词法分析器(Tokenizer或者Lexer)中完成的
语法分析: 接收之前生成的token,把他们转换成一种抽象的表示,这种抽象的表示描述了代码语句中的每一个片段及他们之间的关系,这被称为中间表示(intermediate representation)或抽象语法树(Abstract Syntax Tree, 缩写为AST)
token: 是一个数组,由一些代码语句的碎片组成,他们可以是数字、标签、标点符号、运算符或者其它任何东西 抽象语法树:就是一个对象,只是嵌套特别深,用一种更容易的方式代表了代码本身
-
遍历(Traversal)
- 为了能处理所有的节点,我们需要遍历他们,使用的是深度遍历优先
-
转换(Transformation)
3.1 编辑器的下一步工作是转换,它只是把AST拿过来然后对它做一些修改。它可以在同种语言下操作AST,也可以把AST翻译成全新的语言3.2 AST中有很多相似的元素,这些元素都有type属性,被称为AST节点,这些节点含义若干属性,用于描述AST的部分信息
3.3 当转换AST的时候,我们可以添加、移动、替换这些节点,也可以根据现有的AST生成一个全新的AST
-
代码生成(Code Generation)
编辑器的最后一个阶段是代码生成,这个阶段做的事情有时候会和转换(transformation)重叠,但是代码生成最主要的部分还是根据AST来输出代码
代码生成有几种不同的工作方式,有些编辑器会重用之前生成的token,有些会创建独立的代码表示,以便于线性的输出代码