如何将自定义 AST 转换为 JS 代码

Posted

技术标签:

【中文标题】如何将自定义 AST 转换为 JS 代码【英文标题】:How can I transform a custom AST into JS code 【发布时间】:2018-09-12 18:07:08 【问题描述】:

我目前正在根据我设计的新语言规范生成自定义 AST。此自定义 AST 包含我设计的不同节点,其中包含我现在生成 javascript 代码所需的所有信息。例如:

假设我有一个 customExpressionNode,我希望将其转换为包含几个 if 条件的 JavaScript 函数。

我目前正在研究像 Babylon 和 Esprima 这样的库,以便从我的自定义 AST 生成新的 Javascript AST,但据我所见,这些库使用的 AST 非常复杂。我也想避免将js代码打印到几个文件中然后解析和编译它们,所以我的问题是:

有没有更好的方法以编程方式生成符合 JavaScript 的 AST,我可以使用它来生成 JavaScript 代码?

【问题讨论】:

我不明白你的问题。您的标题要求从您拥有的 AST 生成 JS 代码,使用相应的 Babel 方法应该很简单。您的帖子正文询问有关生成 AST 的问题,但您的第一句话表明您已经可以使用自己的解析器从您自己语言的文件中做到这一点? 感谢@Bergi 的反馈。我已经编辑了这个问题,希望现在很清楚。 因此,您的自定义语言中的 AST 与 babel (etc) 用于 JS AST 的格式不完全一致,您想知道最好的方法是否是 a) 将其翻译为“不必要的复杂” babel AST 并使用 babel 序列化器或 b) 直接序列化为 JS 代码? 是的,这正是我想知道的! @Bergi 我所说的不必要复杂的意思是,它似乎包含很多我可能不需要的额外信息,但我知道这些 AST 很复杂是有充分理由的。 我一直觉得这种格式很简单。当然,如果输出来自解析 JS 文件,则其中有很多调试内容,例如可用于生成源映射的行号,但是当您自己生成它时,您不需要所有这些。我猜很多属性都是可选的,只是尽量把它们排除在外。如果你想在 JS AST 上使用一些常见的 babel 转换(比如转换为 ES5),那么我仍然建议走这条路,否则你自己试试看能不能更简单。 【参考方案1】:

这样的? https://github.com/estools/escodegen

一个简单的例子:程序

escodegen.generate(
    type: 'BinaryExpression',
    operator: '+',
    left:  type: 'Literal', value: 40 ,
    right:  type: 'Literal', value: 2 
)

产生字符串'40 + 2'

【讨论】:

【参考方案2】:

安装@babel/generator

npm install --save-dev @babel/generator
const  default: generate  = require("@babel/generator");

Identifier(path) 
  console.log(generate(path.node).code); // code string
,


【讨论】:

以上是关于如何将自定义 AST 转换为 JS 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 json 转换为自适应卡片 json 格式

如何将自定义类型转换为原始类型?

如何防止 gorm 将自定义整数类型转换为字符串?

如何将自定义属性转换为 Json 字符串

如何正确地将自定义按钮集转换为响应对象?

Swift 4 如何将自定义对象数组转换为 JSON