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

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) => {});


  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
传奇是一款受欢迎的网络游戏,它具有非常多的特色和经典的玩法,吸引了大量的玩家。而开源正是为了拥抱协作共享的精神,使得软件的源代码可以被公开并被他人修改和改进。cnblog是一个著名的技术博客平台,而mir则是传奇游戏的一个开源版本。 开源对于游戏行业来说具有非常重要的意义,首先,开源可以帮助游戏的开发者们快速积累经验和技术能力。通过研究已经开源的游戏代码,开发者可以学习到其他人的优秀设计和解决方案,从而不断提升自己的开发水平。 其次,开源使得游戏更加自由和灵活。玩家可以根据自己的需求对游戏进行修改和定制,比如添加新的功能、调整游戏的平衡性等等。这样一来,玩家可以更好地享受游戏,并且也能促进游戏的不断进步和发展。 对于cnblog这样的技术博客平台而言,它提供了一个交流和分享的平台,使得开源项目能够更好地被推广和传播。很多开源项目的作者会将他们的项目在cnblog上分享,与其他开发者交流心得和经验。这不仅可以获得反馈和建议,也能够帮助更多的开发者了解和使用这些开源项目。 而mir作为一个开源的传奇游戏版本,让更多的开发者可以参与到传奇游戏的开发中来,共同努力打造一个更好的游戏体验。通过开源,传奇游戏也可以不断地进行优化和改进,满足不同玩家的需求,增加游戏的可玩性和乐趣。 总之,开源对于传奇游戏和cnblog都具有重要的意义。它能够推动游戏和技术的发展,促进交流和共享,为玩家和开发者们创造更好的体验和机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值