我在scala中寻找一个从抽象语法树生成JavaScript的库。 我想在最终生成JavaScript的编译器中使用它,我不想自己实现漂亮的打印部分。
答案 0 :(得分:7)
我昨天花了一半时间研究这个。似乎没有标准的独立解决方案。我看过的每个项目都是自己的:
Scala-JS :SébastienDoeraene的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 < / p>
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
< / LI>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
< / LI>提升(请参阅@ 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的两个源文件,看看它是怎么回事。
P.S。我还提到,为了完整起见:
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 。
答案 1 :(得分:2)
Lift Web框架从AST生成JavaScript。但是,我从来没有看过它的一代。这里松散地描述了AST http://exploring.liftweb.net/master/index-10.html
答案 2 :(得分:2)
StringTemplate(来自ANTLR)非常适合代码生成,我会说, 跟踪缩进并将嵌套语句缩进到合适的级别。打印不是很好,但总比没有好。 (与此同时,我想知道为什么你想要漂亮的打印JavaScript,如果到最后它还会被缩小。)
StringTemplate有一个Scala包装器(至少有一个,我好像记得我看到了更多):http://software.clapper.org/scalasti/
Virtualized-scala似乎并不是你所需要的,我会说,因为Scala开始使用Scala AST,而这似乎不是你想要的。
但是,如果您对这些事情感兴趣,也可以查看http://nescala.org/2013/talks#26(由Alvaro Carrasco提供)。
答案 3 :(得分:1)
有Virtualized-Scala项目,其中一个实例是从Scala代码js-scala生成Javascript。在那里,你会找到项目的链接和谈论它。