Skip to content

lxy030988/compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

compiler

目标

let a=1  //es6
==>
var a=1  //es5

编译流程

词法分析 tokenizer

  • 生成一个个词素(token) 每一个token表达一个词的特性
let a=1
[let,a,=,1]
[
  { type: 'Keyword', value: 'let' },
  { type: 'Identifier', value: 'a' },
  { type: 'Punctuator', value: '=' },
  { type: 'Number', value: '1' }
]

语法分析 parser

  • 根据词素 生成抽象语法树 ,描述语法结构
{
    type: 'Program',
    body: [
        {
            type: 'VariableDeclaration',
            declarations: [{
                type: 'VariableDeclarator',
                id: {
                    type: 'Identifier',
                    name: a,
                }, // 定义的变量
                init: {
                    type: 'NumberLiteral',
                    value: Number(1),
                    row:1
                } // 赋予的值
            }],
            kind: 'let',
        }
    ],
    sourceType: 'script'//表示是一个脚本
}

遍历 traverser + 转换 transformer

  • 添加 删除 替换属性节点 改变现有的抽象语法树 =》目标抽象语法树
{
    type: 'Program',
    body: [
        {
            type: 'VariableDeclaration',
            declarations: [{
                type: 'VariableDeclarator',
                id: {
                    type: 'Identifier',
                    name: a,
                }, // 定义的变量
                init: {
                    type: 'NumberLiteral',
                    value: Number(1),
                    row:1
                } // 赋予的值
            }],
            kind: 'var',
        }
    ],
    sourceType: 'script'//表示是一个脚本
}

代码生成 generator

var a=1

进阶

const a = (b) => {
  let c=1
  return b+c
}
==>
var a = function(b){
  var c = 1
  return b + c
}

About

编译原理

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published