我想开发一个工具,一旦Scala编译器完成了所有繁重的工作,该工具就会进行后处理。据我了解,Scala编译器的不同阶段从句法糖和高级功能(如lambdas,lastures,lotatures,taters-satching等)逐步简化了程序。但是,我注意到,所谓的出现的内容清理阶段 - 这是代码生成之前的最后阶段 - 看起来像Scala,但实际上并不是Scala。
有人知道个人还是可以指向我可以帮助我了解 CleanUp阶段的语言的资源?
为您提供一个例子,在 Cleanup 的输出中,我看到了类似的内容
case <synthetic> val x1: Foo$Bar = l;
case9(){
if (...some condition...)
matchEnd8(scala.Predef.Set().empty())
else
case10()
};
我的假设是这是翻译模式匹配的结果,但据我所知,它看起来不像有效的Scala语法(我根本不是经验丰富的Scala开发人员!)。
我想这一切都归结为:是否可以将 Cleanup阶段的输出转换为有效 - 可编译 - Scala代码?
通常,在Scalac编译器的任何阶段(即使在解析后),编译器使用的内部表示形式不再有效Scala代码。这本质上是因为您发现的 labels 和 gotos 。
形式的结构
labelName(...params){
...
}
是标签定义,是表格的调用
labelName(...args)
是该标签的跳跃,将...args
分配给...params
。
标签和gotos由Scalac(和dotc,但具有不同的表示形式)使用,以表示while
和do..while
环路(分析后立即),match
ES的翻译和尾部复位优化的功能。
通常,没有办法从内部表示形式回到有效的Scala代码,尤其是在管道中,如cleanup
。