2009-12-26 24 views
12

Tôi đã nói "mã trực tiếp" vì tôi có nghĩa là không phải từ các tệp nguồn văn bản hoặc chuỗi nguồn, mà là từ partialFunctions/lambdas. (Tôi biết Ruby1.8 của cây phân tích cú pháp và C# LINQ có thể làm điều đó)Tôi có thể lấy AST từ mã scala trực tiếp không?

xem xét một f partialFunction:

val f = (i: Int, j: Int) => (i + j) * 2 

Tôi hy vọng có một số công cụ làm việc như thế này:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2')) 

I don' t quan tâm đến những điều ngữ nghĩa (phân tích bối cảnh và các hàm ý quá phức tạp và không cần thiết đối với tôi), tôi chỉ cần cây cú pháp từ mã trực tiếp, có thể không?

Có thể có vấn đề với việc kiểm tra mã của người khác, nhưng còn mã của riêng tôi thì sao? Những điều sau đây có thể xảy ra không?

val f = AstFunction(i: Int, j: Int){(i + j) * 2} 
f(5, 6) //=> 22 
f.ast //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2')) 

Nó có vẻ cần một số hack vào trình biên dịch, hmmmm ...

Trả lời

17

Trình biên dịch chính nó là một thư viện, mà bạn có thể gọi. Đó là cách REPL hoạt động, trên thực tế. Nhưng trong khi bạn có thể nhận được cây (ở các giai đoạn khác nhau) cho một chuỗi mã, bạn không thể lấy nó cho mã được biên dịch.

Ngoại trừ, tất nhiên, nếu bạn sử dụng các nội dung thử nghiệm có thể thay đổi bất cứ lúc nào hoặc đơn giản là ngừng tồn tại. Trong trường hợp đó, bạn có thể thử:

scala.reflect.Code.lift(f).tree 

Và nhận được:

res17: scala.reflect.Tree = Select(Select(Select(Ident(Field(line26$object,PrefixedType(ThisType(RootSymbol),Class(line26$object)))),Field($iw,PrefixedType(ThisType(Class(line26$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),AppliedType(PrefixedType(ThisType(Class(scala)),Class(scala.Function2)),List(PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int))))))) 

Cho dù đó giúp hay không ... Bạn có thể muốn kiểm tra Miguel Garcia của "The Scala Compiler Corner".

Các vấn đề liên quan