2010-02-12 42 views
7

fewresources trên web có hướng dẫn bằng cách viết trình biên dịch Scala để khớp với mã, nhưng chúng không giúp tạo mã (xây dựng cây biểu tượng) . Tôi nên bắt đầu tìm ra cách để làm điều này? (Nếu có cách dễ dàng hơn là xây dựng cây biểu tượng theo cách thủ công, tôi cũng sẽ quan tâm.)Tạo cây mã Scala từ plugin trình biên dịch Scala

Ví dụ: tôi muốn viết một plugin thay thế một số mã bằng một AST đơn giản cho biểu thức này, trong đó biến (chiết xuất từ ​​các mã chương trình gốc) có thể là của bất kỳ loại:

"" + hello + ", " + world + "!" 

tôi nhận ra điều này có thể được khôn lanh vì đấm bốc và toString, ví dụ: nếu hello là một đối tượng và world là một int, điều này thực sự nên cái gì đó như:

"".+(hello.toString().+(", ".+(new Integer(world).toString().+("!")))) 
+0

Tôi không biết câu trả lời cho câu hỏi của bạn, nhưng Miguel Garcia đã tổng hợp [Góc biên dịch Scala] (http://www.sts.tu-harburg.de/people/mi.garcia/ScalaCompilerCorner /) có lẽ là trình biên dịch tài nguyên có sẵn tốt nhất về trình biên dịch Scala. –

Trả lời

3

Nếu bạn tạo ra các cây trước khi giai đoạn erasure trình biên dịch, bạn có thể gõ helloworld với Any, và gọi toString về họ.

~: cat test.scala 
object test { 
    def f(hello: Any, world: Any) = "" + hello + ", " + world + "!" 
    f("1", "2") 
    f(1, 1) 
} 
~: scalac -Xprint:typer test.scala 
[[syntax trees at end of typer]]// Scala source: test.scala 
package <empty> { 
    final object test extends java.lang.Object with ScalaObject { 
    def this(): object test = { 
     test.super.this(); 
    () 
    }; 
    def f(hello: Any, world: Any): java.lang.String = "".+(hello).+(", ").+(world).+("!"); 
    test.this.f("1", "2"); 
    test.this.f(1, 1) 
    } 
} 

~: scalac -Xprint:erasure test.scala 
[[syntax trees at end of erasure]]// Scala source: test.scala 
package <empty> { 
    final class test extends java.lang.Object with ScalaObject { 
    def this(): object test = { 
     test.super.this(); 
    () 
    }; 
    def f(hello: java.lang.Object, world: java.lang.Object): java.lang.String = "".+(hello).+(", ").+(world).+("!"); 
    test.this.f("1", "2"); 
    test.this.f(scala.Int.box(1), scala.Int.box(1)) 
    } 
} 
+0

Cảm ơn bạn đã trả lời, nhưng điều này không thực sự cho tôi biết làm thế nào để tạo ra một AST. – Yang

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