scaladoc(http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees)またはスライド(http://scalamacros.org/talks/ )をご覧ください。 2012-04-28-MetaprogrammingInScala210.pdf、「学ぶことを学ぶ」の部分)。
これが私が普段していることです。私は、parse
Scalaコードを引数として取り、それをコンパイルするという単純なスクリプトを作成しました-Xprint:parser -Ystop-after:parser -Yshow-trees-stringified -Yshow-trees-compact
(parse
別のヘルパースクリプトを使用します:adhoc-scalac
。ソースも表示するには、ここをクリックしてください)。
このアプローチの利点showRaw
は、タイプチェックするためのコードを必要としないことです。存在しない変数またはクラスを参照する小さなコードスニペットを記述しても、それでも正常に実行され、ASTが表示されます。出力の例を次に示します。
09:26 ~$ parse 'class C { def x = 2 }'
[[syntax trees at end of parser]]// Scala source: tmp36sVGp
package <empty> {
class C extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
def x = 2
}
}
PackageDef(Ident(TermName("<empty>")), List(ClassDef(Modifiers(), TypeName("C"), List(), Template(List(Select(Ident(scala), TypeName("AnyRef"))), emptyValDef, List(DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))), DefDef(Modifiers(), TermName("x"), List(), List(), TypeTree(), Literal(Constant(2))))))))
と呼ばれるスクリプトもありますtypecheck
。これは同じことを行いますが、の後に停止しtyper
ます。これは、タイプチェッカーがパーサーツリーをどのように正確に変換するかを理解するのに役立つ場合があります。ただし、ツールボックスとマクロの両方がパーサーツリーで機能するtypecheck
ため、ツリー構築の目的で使用することはめったにありません。