<分区>
我正在寻找一个从抽象语法树生成 JavaScript 的 scala 库。 我想在最后生成 JavaScript 的编译器中使用它,我不想自己实现 pretty-print 部分。
<分区>
我正在寻找一个从抽象语法树生成 JavaScript 的 scala 库。 我想在最后生成 JavaScript 的编译器中使用它,我不想自己实现 pretty-print 部分。
最佳答案
我昨天花了一半时间研究这个。似乎没有标准、独立 解决方案。我看过的每个项目都有自己的:
Scala-JS:Sébastien Doeraene 的 Scala-JS 项目中的 JavaScript AST 类位于此处:https://github.com/sjrd/scala-js/blob/master/compiler/src/main/scala/scala/tools/nsc/backend/js/JSTrees.scala并且转换为字符串在这里:https://github.com/sjrd/scala-js/blob/master/compiler/src/main/scala/scala/tools/nsc/backend/js/JSPrinters.scala
JScala:Alexander Nemish 的 JScala 项目中的 JavaScript AST 类位于:https://github.com/nau/jscala/blob/master/jscala/src/main/scala/org/jscala/model.scala并且转换为字符串在这里:https://github.com/nau/jscala/blob/master/jscala/src/main/scala/org/jscala/JavascriptPrinter.scala
s2js:Alvaro Carrasco 的 s2js 项目中的 JavaScript AST 类位于:https://github.com/alvaroc1/s2js/blob/master/plugin/src/main/scala/com/gravitydev/s2js/Trees.scala并且转换为字符串在这里:https://github.com/alvaroc1/s2js/blob/master/plugin/src/main/scala/com/gravitydev/s2js/JsPrinter.scala
Lift(参见@thoredge 的回答)将 AST 类与字符串生成结合在一个文件中,此处:https://github.com/lift/framework/blob/master/web/webkit/src/main/scala/net/liftweb/http/js/JsCommands.scala
这些不同的类的独立性和可重用性如何?只是让代码可视化一次,在我看来,JScala 和 s2js 中的 AST 类是独立的,可以很容易地被另一个项目借用。 Scala-JS AST 类似乎更容易与周围环境纠缠在一起;举,更是如此。 (我欢迎改进我的非正式印象的编辑。)
这些不同的项目有多成熟和经过实战考验?我的非正式印象是它们按降序排列如下:Lift、Scala-JS、JScala、s2js。
对于我自己的项目,我想我要从 JScala 中复制并粘贴两个源文件,然后看看效果如何。
附言为了完整起见,我还提到:
js-scala 直接从 Scala AST 生成 JavaScript 字符串,而不是通过中间的 JavaScript AST。 (参见示例 https://github.com/js-scala/js-scala/blob/master/core/src/main/scala/scala/js/gen/js/Compile.scala)有一篇非常好的博客文章比较 js-scala 和 scala.js here .
我没有看Scala-GWT。
关于scala 的 JavaScript 源代码生成库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14198656/