首页 > 其他分享 >AST 变量 enter 和 exit 的区别 退出区别

AST 变量 enter 和 exit 的区别 退出区别

时间:2023-11-24 21:45:07浏览次数:71  
标签:遍历 AST visitor 区别 right exit BinaryExpression path left

1.enter方式进行遍历(不写默认是enter方式)

假设我们需要处理的代码如下:

var a = 'a' + 'b' + 'c' + d + 'e' + 'f';

想要对上面的 代码 进行字符串的合并操作,遍历 BinaryExpression类型,代码如下:

const visitor = {
    "BinaryExpression"(path) {
        console.log(path.toString())
        const {confident, value} = path.evaluate();
        confident && path.replaceWith(types.valueToNode(value));
    },
}

traverse(ast, visitor);

我们知道,当没有指明以什么方式进行遍历时,会默认以enter方式进行遍历,上面的插件运行结果如下:

最后处理后的代码变成了这样:

var a = "abc" + d + 'e' + 'f';

我们在插件的第一行打印出了当前所遍历path的源代码,可以看到①②③④是按顺序进行遍历的,是逐渐向底部进行遍历,直到无法遍历。可以将上面的代码略微的调整下:

var a = 'a' + 'b' + 'c' + 'd' + 'e' + 'f';

再次运行上面的插件,打印的结果如下:

这一次为什么只遍历了一次呢?那是因为第一次遍历后,结果变成了一个 StringLiteral 类型的表达式,

var a = 'abcdef';

已不再是 BinaryExpression 类型,因此不会再次遍历。甚至可以将path的left节点和right节点分别打印出来看看效果:

const visitor = {
    "BinaryExpression"(path) {
        console.log(path.get('left').toString());
        console.log(path.get('right').toString());
        const {confident, value} = path.evaluate();
        confident && path.replaceWith(types.valueToNode(value));
    },
}

traverse(ast, visitor);

2.exit方式进行遍历

当指明以exit方式进行遍历时,插件及部分代码如下:

const visitor = {
    "BinaryExpression": {
        exit: function (path) {
            console.log(path.toString())
            const {confident, value} = path.evaluate();
            confident && path.replaceWith(types.valueToNode(value));
        }
    },
}

traverse(ast, visitor);

很明显和上面enter方式遍历的顺序不一样,大致分析如下:

  1. left : 'a'; right:'b'                   --->   结果合并为'ab'。

  2. left : 'ab'; right:'c'                  --->   结果合并为'abc'。

  3. left : 'abc'; right:d                 --->   结果没法合并,但他们已经成为一个整体 'acb' + d

  4. left : 'abc'+d; right:'e'           --->   结果没法合并,但他们已经成为一个整体 'acb' + d + 'e';

  5. left : 'abc'+d + 'e'; right:'f'   --->   结果没法合并,但他们已经成为一个整体 'acb' + d + 'e'  + 'f';

  6. 不再是BinaryExpression 类型,停止遍历。

上面的left和right表示BinaryExpression 类型的左右子节点。

我画了个示意图,大家可以看看:

 

标签:遍历,AST,visitor,区别,right,exit,BinaryExpression,path,left
From: https://www.cnblogs.com/yoyo1216/p/17854823.html

相关文章

  • 使用python包os.system执行命令与直接在终端执行命令的区别
     区别:1.使用systemctl命令执行时,即使是以root用户身份执行,也会关注服务的用户组权限。这是因为systemctl在执行服务管理操作时,会检查服务的配置文件中设置的用户和用户组权限,并确保当前用户具有足够的权限来管理服务。2.当你以root用户身份使用os.system执行命令时,它可能会绕......
  • LiteCVR前端解码与后端解码有何区别?一文看懂
    高效的视频监控安防解决方案不仅能够捕捉相关画面,更有助于在将来实现以数据驱动的安防功能。视频监控是安防模块的重要环节,随着互联网技术的进步,视频监控技术的发展也越来越快。前两期我们介绍了LiteCVRv3.4版本的页面布局,在【配置中心】-【基础配置】-【开关配置】中有个【前端......
  • javaString字符串转换成加减乘除
    字符串不用分割直接进行加减乘除的操作每天一个无用小技巧!try{ScriptEnginejavascript=newScriptEngineManager().getEngineByName("JavaScript");Stringstring="1*3-6+8/2";//这里是强制转换成数据类型Doubledouble=(Double)javascript.eval(string);......
  • Java 远程调用连接本地ElasticSearch服务并进行操作
    简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地ElasticsearchCpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们能够放心地处理和存储敏感的工作内容。 1.Windows安......
  • java中ArrayList和LinkedList的区别
    Java中ArrayList和LinkedList都是List集合的实现类,它们都可以用来存储一组有序的元素,但是它们的内部实现方式不同,在使用时也有不同的适用场景。ArrayList是一个基于动态数组的实现,它可以容纳任何类型的对象,并且允许对元素进行随机访问。当添加或者删除元素时,ArrayList需要移动内......
  • m基于Faster-RCNN网络的猫脸检测和猫眼定位系统matlab仿真,带GUI界面
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要       猫作为一种受欢迎的宠物,其图像在互联网上大量存在。对猫脸和猫眼进行准确检测和定位,在宠物识别、情感分析等领域具有广泛的应用价值。然而,由于猫脸和猫眼的多样性以及复杂背景的干扰,传统......
  • ElasticSearch之cat count API
    读取当前存储的记录的数量。命令样例如下:curl-XGET"https://localhost:9200/_cat/count?v=true&pretty"--cacert$ES_HOME/config/certs/http_ca.crt-u"elastic:ohCxPH=QBE+s5=*lo7F9"执行结果输出如下:epochtimestampcount170074840914:06:490查看帮助,命......
  • ElasticSearch之配置
    ElasticSearch主要的配置文件,如下:elasticsearch.yml,ElasticSearch的相关参数。jvm.options,JVM的相关参数。log4j2.properties,日志的相关参数。默认情况下,ElasticSearch从$ES_HOME/config目录下读取上述配置文件。启动ElasticSearch时可以使用环境变量ES_PATH_CONF,指定配置......
  • ElasticSearch之cat component templates API
    命令样例如下:curl-XGET"https://localhost:9200/_cat/component_templates?v=true&pretty"--cacert$ES_HOME/config/certs/http_ca.crt-u"elastic:ohCxPH=QBE+s5=*lo7F9"执行结果输出如下:nameversionalias_countm......
  • ElasticSearch之cat anomaly detectors API
    curl-XGET"https://localhost:9200/_cat/ml/anomaly_detectors?v=true&pretty"--cacert$ES_HOME/config/certs/http_ca.crt-u"elastic:ohCxPH=QBE+s5=*lo7F9"执行结果输出如下:curl-XGET"https://localhost:9200/_cat/ml/anomaly_detectors......