首页 > 其他分享 >ast数据类型补充和基础代码注释-cnblog

ast数据类型补充和基础代码注释-cnblog

时间:2024-07-02 17:28:17浏览次数:17  
标签:JavaScript AST babel ast 数据类型 cnblog js 节点 表达式

ast

请添加图片描述

解析代码树

image-20240702094503510

// 声明一个变量 obj,并赋值一个对象
let obj = {
    // 对象的属性 name,值为字符串 "大猩猩"
    name:"大猩猩",
    // 对象的方法 add,接受两个参数 a 和 b
    add:function (a,b){
        // 返回参数 a 和 b 的和加上1000
        return a+b+1000;
    },
    // 对象的方法 mul,接受两个参数 a 和 b
    mul:function (a,b){
        // 返回参数 a 和 b 的乘积加上2
        return a*b+2;
    },
    // 对象定义结束
};

image-20240702095604371

ast 常见语法类型

变量 VariableDeclaration

image-20240702101016653

对比 ast 语法树和 js 代码,首先注意到的是 VariableDeclaration 在 JavaScript 等编程语言中指的是变量声明

子节点 VariableDeclarator

image-20240702100930584

VariableDeclarator 在 AST 中指的是一个特定的节点类型,它用于表示变量声明中的单个变量。在 JavaScript 的 AST 中,VariableDeclarator 节点通常包含以下信息:

  1. id:一个标识符(Identifier)节点,表示变量的名称。
  2. init(可选):一个表达式(Expression)节点,表示变量的初始值。如果变量声明时没有初始值,则此属性可能为空。

两者具有一定的区别

二元运算表达式BinaryExpression

BinaryExpression 是 AST 中的一个节点类型,它代表一个二元运算表达式。二元运算表达式是指包含两个操作数和一个运算符的表达式。在 JavaScript 中,常见的二元运算符包括加法 +、减法 -、乘法 *、除法 /、余数 %、相等 ==、不等于 !=、严格相等 ===、严格不等于 !==、大于 >、小于 <、大于等于 >=、小于等于 <=、逻辑与 &&、逻辑或 || 等。

变量值NumericLiteral

image-20240702101108665

NumericLiteral 是 AST 中的一个节点类型,它代表一个数值字面量。数值字面量是指源代码中直接出现的数字,例如 423.140xFF 等。

标识符的名称Identifier

Identifier 是 AST 中的一个节点类型,它代表一个标识符。在编程语言中,标识符是用户定义的名称,用于标识变量、函数、类、模块或其他用户定义的实体。

image-20240702101147881

对象节点ObjectExpression

image-20240702101609393

ObjectExpression 是 AST 中的一个节点类型,它代表一个对象字面量表达式。在 JavaScript 中,对象字面量是一种用于创建对象的表达式,它由大括号 {} 包围的一组键值对组成,每个键是一个属性名,每个值是一个表达式。

表达式语句ExpressionStatement不改变值

image-20240702103203626

ExpressionStatement 是 AST 中的一个节点类型,它代表一个表达式语句。在 JavaScript 中,表达式语句是由一个表达式构成的单个语句,它执行一个操作但不会改变程序的控制流。表达式语句通常以分号 ; 结尾,尽管在现代 JavaScript 中,自动分号插入(ASI)机制允许在某些情况下省略分号。

赋值表达式AssignmentExpression

image-20240702103310919

AssignmentExpression 是 AST 中的一个节点类型,它代表一个赋值表达式。在 JavaScript 中,赋值表达式包含一个左操作数和一个右操作数,以及一个赋值运算符。左操作数通常是一个变量或对象的属性,右操作数是一个表达式,赋值运算符(如 =+=-= 等)用于将右操作数的值赋给左操作数。

ast基础代码注释

// 引入Node.js的文件系统模块,用于读写文件
const fs = require('fs');
// 引入@babel/parser模块,用于将源代码转换成AST(抽象语法树)
const parser = require("@babel/parser");
// 引入@babel/traverse模块,用于遍历和修改AST
const traverse = require("@babel/traverse").default;
// 引入@babel/types模块,用于创建或判断AST节点类型
const t = require("@babel/types");
// 引入@babel/generator模块,用于将AST转换回代码
const generator = require("@babel/generator").default;

// 读取当前目录下的demon.js文件内容,编码格式为utf-8
const jscode = fs.readFileSync("./demon.js", {
    encoding: "utf-8"
});

// 将读取到的JavaScript代码解析成AST,并设置sourceType为"module"以支持ES模块语法
let ast = parser.parse(jscode, {
    sourceType: "module", // 对import进行控制,防止报错
});

// 使用@babel/generator将AST转换回代码,并设置相关选项
let code = generator(ast, {
    retainLines: false, // 是否与源代码的行号相同,默认是否
    comments: false, // 是否保留源代码的注释,默认是true
    compact: true // 是否压缩代码
}).code;

// 将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile('./demon_new.js', code, (err) => {});


}).code;

// 将生成的代码写入到demon_new.js文件中,如果发生错误则执行回调函数
fs.writeFile(‘./demon_new.js’, code, (err) => {});


标签:JavaScript,AST,babel,ast,数据类型,cnblog,js,节点,表达式
From: https://blog.csdn.net/qq_62943420/article/details/140132193

相关文章

  • fastjson低版本反序列化bug/设计缺陷记录
    1.问题场景 _id正常的赋值相同的代码我们继续跑 _id的值被反序列化到id上了???相同的代码,跑出不一样的反序列化结果,amazing2.问题探究2.1List<FieldInfo>反序列化时会先创建一个List<FieldInfo>每一个FieldInfoList<FieldInfo>的填充方式:遍历Methods[],取出所有的set......
  • CH02_JS变量和数据类型
    第2章:JS中的变量和数据类型本章目标掌握变量的概念掌握如何使用变量掌握javascript中的数据类型课程回顾js的三种使用方式?js的注释有那些?讲解内容1.为什么要使用变量?问题:人类是靠什么要记忆(记录数据)?大脑、作笔记等问题:计算机如果要保存数据,靠什么来保存?硬件......
  • fastjson整理思路
    此处把常用的一些方法,简单做个记录。 做自动化时,我们发送一个请求,返回的是一个字符串。首先我们要把这个字符串转换为json对象  parseObject():将JSON字符串解析为Java对象。 Stringjson="{\"person\":{\"name\":\"Ivy\",\"age\":60}}";JSONO......
  • Elasticsearch架构基本原理
    Elasticsearch的架构原理可以详细分为以下几个方面进行介绍:一、Elasticsearch基本概念Elasticsearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful搜索和分析引擎。它支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位置和对象间关联关系搜索等功能。ES使用Ja......
  • 实战篇——SQL注入sqli-labs-master靶场实战一
    实战篇——SQL注入sqli-labs-master靶场实战(1)SQL注入的原理没有对用户的输入进行合法性判断或过滤,而是直接将其拼接至SQL查询语句当中作为命令执行,从而导致非法操作。SQL注入的检测也就是闭合方式的判断,根据报错信息的不同情况可以分为3类——(1)有报错信息(2)无报错信息,但......
  • JavaScript 编程语言【 数据类型】过滤|排序|映射|迭代
    文章目录将border-left-width转换成borderLeftWidth过滤范围原位(inplace)过滤范围降序排列复制和排序数组创建一个可扩展的calculator映射到names映射到对象按年龄对用户排序随机排列数组获取平均年龄数组去重从数组创建键(值)对象Iterableobject(可迭代对象)Symbol.......
  • Nanami and the Last Enigma (hard version)
    如果从前缀和的视角考察题目中需要统计的信息,那么子段和=x等价于s[r]-s[l-1]=x于是我们虽然不能O(1)地求出w(l,r),但是可以O(1)地将已知的w(l,r)扩展w(l,r)是一个非常明显的满足“包含大于等于交叉”的四边形不等式的函数,除此之外,通过打表找规律,也可以发现DP有决策单调性决策单......
  • Elasticsearch:Painless scripting 语言(二)
    这是继上一篇文章“Elasticsearch:Painlessscripting语言(一)”的续篇。使用field API访问文档中的字段警告:FieldAPI仍在开发中,应视为测试版功能。API可能会发生变化,此迭代可能不是最终状态。有关功能状态,请参阅#78920。使用field API访问文档字段:field('my_......
  • 1、变量和简单数据类型
    1.1变量的命名和适用①必须是字母,数字,下划线。不能数字开头message="xxxx"1_message="xxxx"(不行)_message="xxx"0="xxx"(不行)②常变量名之间不能有空格greetingmessage="xxx"(不行)greeting_message="xxx"③不能用......
  • 如何编写基于RecursiveASTVisitor的ASTFrontendAction
    介绍我现在工作中要写个fuzz引擎,语法分析部分用到了clang的接口,打算写一些博客记录绍下,ast(抽象语法树),libtooling接口的使用等等,文章主要是翻译英文文档在本教程中,您将学习如何创建一个FrontendAction,使用RecursiveASTVisitor查找具有指定名称的CXXRecordDeclAST节点......