0

我想像 Sweet.js 一样向我的 JavaScript 文件添加新语法,但使用 Clojure/ClojureScript 进行转换。

这是我想做的事情:

//original

specialFunction add(a, b) {
   return a + b;
}


//transformed

function add(a, b) {
   return a + b;
}
registerSpecialFunction({
   name: "add",
   args: ["a", "b"],
   func: add
});

如果我错了,请纠正我,但我认为最好的方法是:

  1. 将 JS 文件解析为 AST
  2. 做转换
  3. 将生成的 AST 打印为 JavaScript

关于如何执行第 1 部分和第 3 部分的任何想法?我在这里有正确的想法吗?

4

1 回答 1

1

提醒一下,这可能是一项艰巨的任务,但可能是一项很棒的学习练习。

如果您想从 Clojure 获得相同的控制,您将不得不重新实现 Sweet.js 中的概念或宏,或者来自 Babylon(Babel 的解析器)的自定义解析器扩展的想法。

无论哪种方式,您都需要编写一个能够理解 JavaScript 语法超集的解析器。您可能想查看解析器生成器,例如instaparse (Clojure)peg.js (JavaScript)

然后您需要决定是要对语言语法进行固定数量的添加(如 Babel)还是允许宏定义自己的语法扩展/替换规则(如 Sweet.js)。此时,您需要编写某种引擎来转换解析器生成的 AST。

宏可以通过多种方式实现,从C 和 C++ 中的替换规则到Clojure 中直接与 AST 一起工作的完整编译时评估函数。

使用这个新工具解析和转换 AST 后,您需要将其转换为有效的 JavaScript AST。这将使维护与ESTree 规范的兼容性变得更容易,因为这将允许您使用escodegen等工具从 AST 本身实际生成 JavaScript 代码。

当然,只有当您将工具编写为 ClojureScript 并针对 NodeJS 编译和运行它时,才能使用像 peg.js 和 escodegen 这样的工具。另一种选择是在 JVM 生态系统中找到兼容的工具,并将它们与 JVM 编译的 Clojure 一起使用。

JavaScript 生态系统有一系列很好的工具可用于解析、转换和生成 ES 代码(查看 Babel 包,例如/灵感),但你必须记住,如果你正在编写 ClojureScript 并在 Node 下运行它,实际上,您正在创建一个 JavaScript 可执行文件,并且从一开始就使用 JavaScript 可能会更容易一些。

于 2017-03-13T20:36:25.733 回答