あなたはhttp://scalamacros.org/talks/2012-04-28-MetaprogrammingInScala210.pdf(scaladoc(http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees)で、またはスライドを見てみることができ、 "学習することを学ぶ ")。
ここは私が通常行っていることです。私はparse
という簡単なスクリプトを書いています。スカラコードを引数にとり、-Xprint:parser -Ystop-after:parser -Yshow-trees-stringified -Yshow-trees-compact
(parse
は別のヘルパースクリプト:adhoc-scalac
。click hereを使用してそのソースも表示します)でコンパイルします。
このアプローチの利点は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
を使用しません。
ありがとうございます!その論文はすばらしい資源です。 – Bill
ありがとうございます:-)それほど古くはありませんね。 –
どうすればこのようなグラフを描くことができますか? – Freewind