问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

抽象语法树的结点是函数的情况怎么办

发布网友 发布时间:2022-04-23 08:36

我来回答

3个回答

懂视网 时间:2022-04-23 12:57

本文我们主要和大家分享简单明了的JS抽象语法树,我们首先会介绍什么是抽象语法树,希望能帮助到大家。

babel是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对js的解析在生成的过程,babel有引擎babylon,早期fork了项目acron,了解这个之前我们先来看看这种引擎解析出来是什么东西。不光是babel还有webpack等都是通过javascript parser将代码转化成抽象语法树,这棵树定义了代码本身,通过操作这颗树,可以精准的定位到赋值语句、声明语句和运算语句

什么是抽象语法树

我们可以来看一个简单的例子:

var a = 1;
var b = a + 1;

我们通过这个网站,他是一个esprima引擎的网站,十分好用.画成流程图如下:

而他的json对象格式是这样的:

{
 "type": "Program",
 "body": [
 {
  "type": "VariableDeclaration",
  "declarations": [
  {
   "type": "VariableDeclarator",
   "id": {
   "type": "Identifier",
   "name": "a"
   },
   "init": {
   "type": "Literal",
   "value": 1,
   "raw": "1"
   }
  }
  ],
  "kind": "var"
 },
 {
  "type": "VariableDeclaration",
  "declarations": [
  {
   "type": "VariableDeclarator",
   "id": {
   "type": "Identifier",
   "name": "b"
   },
   "init": {
   "type": "BinaryExpression",
   "operator": "+",
   "left": {
    "type": "Identifier",
    "name": "a"
   },
   "right": {
    "type": "Literal",
    "value": 1,
    "raw": "1"
   }
   }
  }
  ],
  "kind": "var"
 }
 ],
 "sourceType": "script"
}

众多的引擎

chrome有v8,firefix有spidermonkey.还有一些常用的引擎有:

  • esprima

  • acron

  • Traceur

  • UglifyJS2

  • shift

  • 下面是一些引擎的速度对比,以及用不同的框架,引擎们的加载速度:

    我个人认为,封装的越完美的,其实解析的时间更长,引擎之间也是acron这个速度比较优秀,babel引擎前身就是fork这个项目的。

    AST的三板斧

  • 通过esprima生成AST

  • 通过estraverse遍历和更新AST

  • 通过escodegen将AST重新生成源码

  • 我们可以来做一个简单的例子:

    1.先新建一个test的工程目录
    2.在test工程下安装esprima、estraverse、escodegen的npm模块

    npm i esprima estraverse escodegen --save

    3.在目录下面新建一个test.js文件,载入以下代码:

    const esprima = require('esprima');
    let code = 'const a = 1';
    const ast = esprima.parseScript(code);
    console.log(ast);

    你将会看到输出结果:

    Script {
     type: 'Program',
     body:
     [ VariableDeclaration {
     type: 'VariableDeclaration',
     declarations: [Array],
     kind: 'const' } ],
     sourceType: 'script' }

    4.再在test文件中,载入以下代码:

    const estraverse = require('estraverse');
    
    estraverse.traverse(ast, {
     enter: function (node) {
     node.kind = "var";
     }
    });
    
    console.log(ast);

    输出的结果:

    Script {
     type: 'Program',
     body:
     [ VariableDeclaration {
     type: 'VariableDeclaration',
     declarations: [Array],
     kind: 'var' } ],
     sourceType: 'script' }

    5.最后在test文件中,加入以下代码:

    const escodegen = require("escodegen");
    const transformCode = escodegen.generate(ast)
    
    console.log(transformCode);

    输出的结果:

    var a = 1;
  • 通过这三板斧:我们将const a = 1转化成了var a = 1

  • 有没有babel的感觉0.0

    推荐网站

    esprima源码
    acron源码
    speed comparison
    AST explorer
    esprima可视化
    在线可视化AST

    总结

    抽象树在前端用的很多很多,现在流行的工具,不管是webpack还是babel都会通过那个三板斧的流程,这里我只是大致介绍一下,过段时间,会出一篇抽象树的语法,有兴趣的也可以把esprima的源码看一下,为什么是esprima呢,因为esprima的资料比较多,而acron比较轻量级。有兴趣的可以关注一下我的[github](),记得点个star,就当是对笔者的支持,谢谢。

    热心网友 时间:2022-04-23 10:05

    代表函数的节点类型定义为'F',函数名是左儿子,参数是右儿子。

    如果有多个参数,则把参数表作为右儿子,类型定义为'L',参数表的左儿子是第一个参数,右儿子是接下来的参数,如果接下来只有1个参数,则右儿子也是参数;如果接下来有多个参数,则右儿子依然是参数表,以此类推。

    例如sqrt(10):

    例如Max(4,6):

    热心网友 时间:2022-04-23 11:23

    抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 mac terminal怎么查看文件大小 怎么查看mac os 程序大小 成年人的健康系统认证成功后需要多久才能符合修改健康系统的条件 腾讯健康认证系统不全 海尔冰箱自从有一次除霜后,发现冷藏室制冷效果不好了,这是什么情况啊 各种编程语言抽象语法树分别是什么样子的? 餐的韵母是什么 福聚源的拼音怎么写 兀、调、炉、蜿、峦、聚,韵母相同的字() “绿色”“女生”“团聚”这三个词中“绿”“女”“聚”的韵母不相同如果是打对,如果错打叉 聚、绿、女三个字韵母相同吗? 聚的韵母是什么 中山公积金提取材料包括哪些,哪里可代办的 呼和浩特哪里修耳机 是否能提取中山的公积金,不知有中介可以帮忙吗? 呼和浩特华为客户服务中心呼和浩特市有谁知道维修华为牌子耳机的地方? 中山的公积金如果想要找人代取,行吗 运行里常用的快捷键 我的信用卡逾期连续三期,累计四次!有人说我最近进入征信黑名单了!要多久才会从银行征信黑名单删除呢? 各种编程语言抽象语法树分别是什么样子的 煮熟的鸡蛋会不会上浮 防水勾线笔写在黑板上擦不干净怎么办? 煮熟的鸡蛋能浮上来吗? 鸡蛋煮熟为什么浮不起的原因 一个“提手”加一个 “上下” 怎么念? 新苹果手机抖音私信内容旧手机能收到吗 图甲是一个水桶模型示意图,水桶提手结构的平面图是轴对称图形。当点O到BC(或DE)的距离大于或等于圆O的 图甲是一个水桶模型示意图,水桶提手结构是轴对称图形 一些字的结构,部首,音序等等,来做下啊 搬是什么结构的字 丰硕的硕左边加一个提手,念什么? 《这个大佬是凡人》最新章节全文阅读免费下载百度网盘资源,谁有? 四星级酒店自助餐标准 九爷,宠妻请节制!_by诺久一_txt全文阅读,百度网盘免费下载 大佬您家夫人又野了_by墨轻北_txt全文阅读,百度网盘免费下载 大佬您家夫人又野了_by墨轻北_txt全文免费阅读 闲鱼怎么改名字要180天再改 降权淘宝号能改会员名吗 氧化钠除了和水反应,还可以和什么物质反应生成氢氧化钠? na2o与什么反应生成naoh