【发布时间】:2012-12-21 08:12:33
【问题描述】:
我在 scala 中寻找一个从抽象语法树生成 JavaScript 的库。 我想在最后生成 JavaScript 的编译器中使用它,我不想自己实现漂亮的打印部分。
【问题讨论】:
标签: javascript scala code-generation abstract-syntax-tree
我在 scala 中寻找一个从抽象语法树生成 JavaScript 的库。 我想在最后生成 JavaScript 的编译器中使用它,我不想自己实现漂亮的打印部分。
【问题讨论】:
标签: javascript scala code-generation abstract-syntax-tree
Lift Web 框架从 AST 生成 JavaScript。但是,我从来没有看过它的世代结束。这里对 AST 进行了粗略的描述 http://exploring.liftweb.net/master/index-10.html
【讨论】:
有一个 Virtualized-Scala 项目,它的一个实例是从 Scala 代码生成 Javascript,js-scala。在那里你会找到项目的链接并讨论它。
【讨论】:
StringTemplate(来自 ANTLR)非常适合代码生成,我想说,它确实 跟踪缩进并将嵌套语句的缩进保持在正确的级别。不是很漂亮的印刷,但总比没有好。 (同时,我想知道你为什么要打印漂亮的 JavaScript,如果最终它会被缩小。)
有一个用于 StringTemplate 的 Scala 包装器(至少有一个,我记得我见过更多):http://software.clapper.org/scalasti/
我想说,Virtualized-scala 似乎不是您需要的,因为它以 Scala 和 Scala AST 开头,而这似乎不是您所需要的。
但是,如果您也对这类事情感兴趣,您可能还想查看http://nescala.org/2013/talks#26(由 Alvaro Carrasco 撰写)。
【讨论】:
我昨天花了一半时间研究这个。似乎没有标准的、独立的解决方案。我看过的每个项目都有自己的:
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。
【讨论】: