2010-02-12 69 views
7

Web上有一个fewresources,它对编写与代码模式匹配的Scala编译器插件具有指导意义,但这些插件无助于生成代码(构建符号树) 。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建符号树更简单的方法,我也会感兴趣。)从Scala编译器插件生成Scala代码树

例如,我想编写一个插件,用一个简单的AST代替这个表达式的代码,其中变量(从原来的程序代码中提取)可以是任何类型的:

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

我意识到这可能因为拳击和toString,例如是棘手的如果 hello是一个对象,并world是一个int,这确实应该 是这样的:

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

我不知道你的问题的答案,但米格尔·加西亚把[斯卡拉编译器角]放在一起(http://www.sts.tu-harburg.de/people/mi.garcia/ScalaCompilerCorner /),这可能是有关Scala编译器资源的最佳可用汇编。 – 2010-02-12 04:55:58

回答

3

如果生成erasure编译阶段之前的树,你可以输入helloworldAny,并调用toString在他们。

~: 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

感谢您的回复,但这并不能告诉我如何生成AST。 – Yang 2010-02-13 00:59:45