AST
#工程化
AST
什么是AST
AST
是 Abstract Syntax Tree
的简称,是前端工程化绕不过的一个名词。它涉及到工程化诸多环节的应用,比如:
- 如何将 Typescript 转化为 Javascript (typescript)
- 如何将 SASS/LESS 转化为 CSS (sass/less)
- 如何将 ES6+ 转化为 ES5 (babel)
- 如何将 Javascript 代码进行格式化 (eslint/prettier)
- 如何识别 React 项目中的 JSX (babel)
- GraphQL、MDX、Vue SFC 等等
而在语言转换的过程中,实质上就是对其 AST 的操作,核心步骤就是 AST 三步走
- Code -> AST (Parse)
- AST -> AST (Transform)
- AST -> Code (Generate)
TS转换JS的过程:TS的Code 转成 TS的AST;TS的AST转成JS的AST;JS的AST转成JS的Code
以下是一段代码,及其对应的 AST(抽象的语法树)
1 |
|
不同的语言拥有不同的解析器,比如 Javascript 的解析器和 CSS 的解析器就完全不同。(一般JS的解析器是babel,CSS的解析器是postCss)
对相同的语言,也存在诸多的解析器,也就会生成多种 AST,如 babel
与 espree
。
在 AST Explorer (opens new window)中,列举了诸多语言的解析器(Parser),及转化器(Transformer)。
使用不同的解析器,就会解析出不同的AST
词法分析 (Lexical Analysis)
词法分析用以将代码转化为 Token
流,维护一个关于 Token 的数组
1 |
|
词法分析后的 Token 流也有诸多应用,如:
- 代码检查,如 eslint 判断是否以分号结尾,判断是否含有分号的 token
- 语法高亮,如 highlight/prism 使之代码高亮
- 模板语法,如 ejs 等模板也离不开
语法分析 (Syntactic Analysis)
语法分析将 Token 流转化为结构化的 AST,方便操作
1 |
|
AST的应用
可参考一个最简编译器的实现 the super tiny compiler
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!