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