我想开发一个工具,一旦scala编译器完成了所有的任务,就会对Scala程序进行后置处理。根据我对scala编译器不同阶段的理解,它在语法糖和高级特性(如lambdas、闭包、模式匹配等)方面逐步简化了程序。然而,我注意到所谓的清理阶段--这是代码生成之前的最后一个阶段--看起来像Scala,但实际上不是scala。
是否有人亲自知道,或能向我指出一个资源,可以帮助我理解清理阶段的语言?
举个例子,在清理阶段的输出中,我看到了如下内容:
case <synthetic> val x1: Foo$Bar = l;
case9(){
if (...some condition...)
matchEnd8(scala.Predef.Set().empty())
else
case10()
};
我的假设是,这是翻译模式匹配的结果,但据我所知,它并不像有效的scala语法(我根本不是一个经验丰富的Scala开发人员!)
我想这一切都归结于这样:一般情况下,是否有可能将清理阶段的输出转换为有效的可编译scala代码?
发布于 2017-12-01 10:05:53
通常,在scalac编译器的任何阶段(甚至在解析之后),编译器使用的内部表示不再是有效的Scala代码。这主要是因为标签和gotos的存在,你发现了。
形式的结构
labelName(...params){
...
}
是一个标签定义,也是对窗体的调用。
labelName(...args)
是跳转到该标签,将...args
分配给...params
。
标号和gotos被scalac (和dotc,但具有不同的表示形式)用于表示while
和do..while
循环(解析后立即)、match
es的转换和尾递归优化函数。
通常,无法从内部表示返回到有效的Scala代码,尤其是在cleanup
之后。
https://stackoverflow.com/questions/47583646
复制相似问题