抽象構文ツリーから 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 から 2 つのソース ファイルをコピー アンド ペーストして、どうなるか見てみようと思います。
PS私はまた、完全を期すために言及します:
js-scalaは、中間の JavaScript AST を経由するのではなく、Scala AST から直接 JavaScript 文字列を生成します。(たとえば、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を見ていませんでした。
Lift Web フレームワークは、AST から JavaScript を生成します。しかし、私はその世代末を見たことがありません。AST はここで大まかに説明されていますhttp://exploring.liftweb.net/master/index-10.html
StringTemplate (ANTLR から) はコード生成に非常に適していると思います。インデントを追跡し、ネストされたステートメントを適切なレベルでインデントし続けます。きれいな印刷ではありませんが、何もないよりはましです。(同時に、最終的に縮小されるのであれば、きれいに印刷された JavaScript が必要な理由も不思議です。)
StringTemplate の Scala ラッパーがあります (少なくとも 1 つ、もっと見た覚えがあるようです): http://software.clapper.org/scalasti/
Virtualized-scala は、Scala a Scala AST から始まるので、あなたが必要とするものではないようです。それはあなたが持っているように見えるものではありません。
ただし、そのようなことにも興味がある場合は、http://nescala.org/2013/talks#26 (Alvaro Carrasco 著) も確認してください。
Virtualized-Scala プロジェクトがあり、そのインスタンスの 1 つは Scala コードjs-scalaから Javascript を生成しています。そこにはプロジェクトへのリンクがあり、それについて話しています。