参考自:mirrors / starkwang / the-super-tiny-compiler-cn · GIT CODE
比较简单的理解一下步骤:
比如要计算这个的值:2 + (4 - 2)
lisp 风格的代码实现:(add 2 (subtract 4 2))
C 风格的代码实现: add(2, subtract(4, 2))
现在把lisp编译成C(可以理解为由es6编译成es5。。。就这样理解吧)
1、把原始代码(lisp风格)分割成一些被称为 Token 的东西
*
* (add 2 (subtract 4 2))
*
* 它产生的 Token 看起来或许是这样的:
*
* [
* { type: 'paren', value: '(' },
* { type: 'name', value: 'add' },
* { type: 'number', value: '2' },
* { type: 'paren', value: '(' },
* { type: 'name', value: 'subtract' },
* { type: 'number', value: '4' },
* { type: 'number', value: '2' },
* { type: 'paren', value: ')' },
* { type: 'paren', value: ')' }
* ]
2、将 Token转换为抽象语法树(AST),AST描述了代码语句中的每一个片段以及它们之间的关系。
* AST像这样:
*
* {
* type: 'Program',
* body: [{
* type: 'CallExpression',
* name: 'add',
* params: [{
* type: 'NumberLiteral',
* value: '2'
* }, {
* type: 'CallExpression',
* name: 'subtract',
* params: [{
* type: 'NumberLiteral',
* value: '4'
* }, {
* type: 'NumberLiteral',
* value: '2'
* }]
* }]
* }]
* }
3、通过添加、移动、替代现有的 AST 生成一个全新的 AST,也就是lisp风格的AST转换成C风格的AST。
4、根据C风格的AST,生成C风格的代码。