编译器 简单总结

参考自: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风格的代码。

上一篇:关于ASTER L1T产品介绍及预处理流程


下一篇:Faster R-CNN学习COCO数据集