五分钟了解抽象语法树(AST)babel是如何转换的?
抽象语法树
什么是抽象语法树?
It is a hierarchical program representation that presents source code structure according to the grammar of a programming language, each AST node corresponds to an item of a source code.
抽象语法树是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构
看不懂没关系,抽象语法树有很多章节,我们不需要逐一了解
这篇文章会帮你建立起,抽象语法树的印象
我们只需要把目光聚焦于词法分析(Lexical Analysis)和语法分析(Syntax Analysis)上,这两步在转换抽象语法树过程中扮演着极其重要的角色。
词法分析 Lexical Analysis
也叫scanner(扫描器),它读取我们的source code中你的每一个字符,转换成token(词法令牌), 最后,我的源代码可能会被转换成 list of tokens
input => const a = 5;
output => [{type: 'keyword', value: 'const', ...}, {type: 'identifier', value: 'a', ...}, {type: 'value', value: '5', ...}, ...]
语法分析 Syntax Analysis
也叫parser(解析器),将词法分析器解析出的list of token,转换成tree representation
input => [{type: 'keyword', value: 'const', ...}, {type: 'identifier', value: 'a', ...}, {type: 'value', value: '5', ...}, ...]
output => [{type: 'VariableDeclarator', declarations: {kind: 'const', type: 'Identifier', name: 'a'}, init: {type: 'Literal', value: '5'}, ...}]
最终,经过词法分析和语法分析,我们的代码被转换成了一个树形节点
所有的树形节点组合起来,就形成了concrete syntax tree(混合语法树),该树虽然和代码并不是100%匹配,但却包含了足够的信息使解析器能够正确的处理代码
Babel
babel是一个js编译器,他解析高版本es语法代码,生成向后兼容的低版本js代码。
how it works ?
在高层次上,babel解析分为三步
parser => transform => generate
我们将使用伪代码分析每一步的输入输出目标
step 1: parser
import * as BabelParser from '***@babel/parser*';
const code = ` const a = 5 `;
const ast = BabelParser.parse(code);
首先,parser输入源码,输出抽象语法树ast
step 2: transform
import traverse from '***@babel/traverse***';
const new_ast = traverse(ast, {
enter(path) {
if (path.node.type === 'Identifier') {
// do something transformal
}
...
}
});
然后, 结合babel preset,plugin,转换上述ast,生成新的ast
step3: generate
import generate from '***@babel/generator***';
const newCode = generate(new_ast);
最后,根据新的语法树ast,生成编译后新的代码
总结起来就是:
parser: source_code => ast
traverse: ast => new_ast
generate: new_ast => target_code
实际上,babel的转换过程就是构建和修改抽象语法树的过程。
五分钟了解抽象语法树(AST)babel是如何转换的?的更多相关文章
- AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一 ...
- vue 的模板编译—ast(抽象语法树) 详解与实现
首先AST是什么? 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言 ...
- 1 Java程序文件中函数起始行和终止行在程序文件位置中的判定__抽象语法树方法
应用需求: 实现对BigCloneBench中函数体的克隆检测,必须标注出起始行号和终止行号. 问题: 给定一个Java文件,从中提取出每个函数的起始行和终止行. 难点: 这个问题的难点在于,对于Ja ...
- 抽象语法树简介(ZZ)
转载自: http://www.cnblogs.com/cxihu/p/5836744.html (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状 ...
- SQL抽象语法树及改写场景应用
1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...
- 编程语言的实现,从AST(抽象语法树)开始
学习博客:https://baijiahao.baidu.com/s?id=1626159656211187310&wfr=spider&for=pc
- 【JAVA-JDT-AST】Java抽象语法树的构建、遍历及转成dot格式(附Github源码)
Background: 最近为了重现tree-based clone detection的论文:L. Jiang, G. Misherghi, Z. Su, and S. Glondu. Deckar ...
- 五分钟学会 Kotlin 语法
为什么使用Kotlin 项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受.因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人 ...
- JavaScript抽象语法树英文对照
type:"Program" //顶级对象类型 type:"Identifier" // 标识符 type:"FuncationDeclaration ...
随机推荐
- 'NoneType' object has no attribute shape
使用cv2读取图片时,输出图片形状大小时出现报错“ 'NoneType' object has no attribute shape”,后来排查发现读取图片的返回值image为None, 这就说明图片 ...
- Spring Boot动态注入删除bean
Spring Boot动态注入删除bean 概述 因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bean,包括:动态注入,动态删除. 动态注入 ...
- EXCEL的VBA(宏)编程
EXCEL的VBA编程 杨康需要我完成的需求 第一列是名称 第二列是甲方账户 第三列是甲方金额 第四列是乙方账户 第五列是乙方金额 第六列是true或false 第七列备注 需求 开始时数据对齐的,如 ...
- 推荐一本学习Groovy的书籍Groovy程序设计!
有朋友公司在用groovy开发,于是推荐我学习一下,搜到了这本书: 花了一个月时间读完了这本书!写的很棒,几乎没有废话,全书都是很重要的知识点和很好的讲解,确实像封面说的那样,使用的好可以提高开发效率 ...
- try catch finally的理解
定义以及用法: try/catch/finally 语句用于处理代码中可能出现的错误信息. 错误可能是语法错误,通常是程序员造成的编码错误或错别字.也可能是拼写错误或语言中缺少的功能(可能由于浏览器差 ...
- JMeter入门 | 第一个并发测试
JMeter入门 | 第一个并发测试 背景 近期我们组新来了一些新同事,之前从来没有用过JMeter做个并发测试,于是准备了一系列小教程去指引新同事,本章主要是新人入门体验教程,快速实现第一个接口并发 ...
- maven jar 包问题
1. Failure to transfer... 这种错误基本是所需要的 jar 包不存在,或者下载不完整,可去本地仓库查看相关 jar 文件的完整性 解决方案: 删除对应 jar 包,重新下载(删 ...
- Java 加密/解密Excel
概述 设置excel文件保护时,通常可选择对整个工作簿进行加密保护,打开文件时需要输入密码:或者对指定工作表进行加密,即设置表格内容只读,无法对工作表进行编辑.另外,也可以对工作表特定区域设置保护,即 ...
- 【WPF学习】第三十三章 高级命令
前面两章介绍了命令的基本内容,可考虑一些更复杂的实现了.接下来介绍如何使用自己的命令,根据目标以不同方式处理相同的命令以及使用命令参数,还将讨论如何支持基本的撤销特性. 一.自定义命令 在5个命令类( ...
- pico g2 触摸板手柄射线检测---for unity
1.pico g2手柄射线检测UI,需要在canvas添加Graphic Raycaster脚本和Pvr_Ui Canvas脚本. 2.删除掉原有的maincamera,将Pvr_unitySDK下h ...