【问题标题】:How can I transform a custom AST into JS code如何将自定义 AST 转换为 JS 代码
【发布时间】: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),那么我仍然建议走这条路,否则你自己试试看能不能更简单。

标签: javascript code-generation abstract-syntax-tree esprima babel-babylon


【解决方案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
    },
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2021-04-20
      相关资源
      最近更新 更多