前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是AST

什么是AST

原创
作者头像
挥刀北上
修改2021-02-19 17:56:45
1.4K0
修改2021-02-19 17:56:45
举报
文章被收录于专栏:Node.js开发

AST是抽象语法树的简称,它就是你所写代码的的树状结构化表现形式。

AST能干什么呢?

有了这棵树,我们就可以通过操纵这颗树,精准的定位到声明语句、赋值语句、运算语句等等,实现对代码的分析、优化、变更等操作。具体如下:

IDE的错误提示、代码格式化、代码高亮、代码自动补全等JSLint、JSHint对代码错误或风格的检查等webpack、rollup进行代码打包等CoffeeScript、TypeScript、JSX等转化为原生Javascript。

如何生成AST呢?

用一个叫做jsparser的工具来转化,

整个解析过程主要分为以下两个步骤:

分词:将整个代码字符串分割成最小语法单元数组

语法分析:在分词基础上建立分析语法单元之间的关系

什么是语法单元呢?

关键字:例如 var、let、const等

标识符:没有被引号括起来的连续字符,可能是一个变量,也可能是 if、else 这些关键字,又或者是 true、false 这些内置常量 运算符: +、-、 *、/ 等

数字:像十六进制,十进制,八进制以及科学表达式等语法

字符串:因为对计算机而言,字符串的内容会参与计算或显示

空格:连续的空格,换行,缩进等

注释:行注释或块注释都是一个不可拆分的最小语法单元

其他:大括号、小括号、分号、冒号等

如下面的语句

代码语言:javascript
复制
 var a = 1;

通过分词得到如下结构:

代码语言:javascript
复制
[
    {
        "type": "Keyword",
        "value": "var"
    },
    {
        "type": "Identifier",
        "value": "a"
    },
    {
        "type": "Punctuator",
        "value": "="
    },
    {
        "type": "Numeric",
        "value": "1"
    },
    {
        "type": "Punctuator",
        "value": ";"
    }
]

可以通过这个网站来进行测试转换https://esprima.org/demo/parse.html#。

然后就是语法分析,上面我们已经得到了我们分词的结果,需要将词汇进行一个立体的组合,确定词语之间的关系,确定词语最终的表达含义。简单来说语法分析是对语句和表达式识别,确定之前的关系,这是个递归过程。上面我们通过语法分析,可以得到如下结果:

代码语言:javascript
复制
{
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "a"
                    },
                    "init": {
                        "type": "Literal",
                        "value": 1,
                        "raw": "1"
                    }
                }
            ],
            "kind": "var"
        }
    ],
    "sourceType": "script"
}

得到抽象语法树后,我们可以将抽象语法树还原为js,这里就可以进行一些操作了,我们可以修改抽象语法树,然后再将其转化为js语言,这样就达到了将某一个版本的js转化为另外一个版本的js的作用。

以上就是AST的作用,希望对你有所帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档