Bạn có thể có một cái nhìn tại scaladoc (http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees) hoặc tại các slide (http://scalamacros.org/talks/2012-04-28-MetaprogrammingInScala210.pdf, các " Học cách học "phần".
Đây là những gì tôi thường làm. Tôi đã viết một kịch bản đơn giản có tên là parse
, mã Scala làm đối số và sau đó biên dịch nó với -Xprint:parser -Ystop-after:parser -Yshow-trees-stringified -Yshow-trees-compact
(parse
sử dụng một tập lệnh trợ giúp khác: adhoc-scalac
. click here để xem các nguồn của nó).
Lợi thế cách tiếp cận này có trên showRaw
là không yêu cầu mã để đánh máy. Bạn có thể viết một đoạn mã nhỏ, đề cập đến các biến hoặc lớp không tồn tại và nó vẫn chạy thành công và hiển thị cho bạn AST. Dưới đây là một ví dụ về đầu ra:
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))))))))
Ngoài ra còn có một kịch bản gọi là typecheck
, mà không giống nhau, nhưng dừng lại sau khi typer
. Điều đó đôi khi rất hữu ích để hiểu chính xác typechecker biến đổi cây phân tích cú pháp như thế nào. Tuy nhiên, cả hai hộp công cụ và macro đều hoạt động với các cây phân tích cú pháp, vì vậy tôi sử dụng typecheck
cho mục đích xây dựng cây rất hiếm khi.
Nguồn
2013-02-10 08:30:43
Cảm ơn! Luận án đó là một nguồn tài nguyên tuyệt vời. – Bill
Cảm ơn bạn :-) Tôi hy vọng nó không quá nhiều lỗi thời .. –
Làm thế nào chúng ta có thể vẽ một đồ thị như vậy? – Freewind