清理阶段后的Scala编译器输出

清理阶段后的Scala编译器输出,scala,compiler-construction,code-translation,intermediate-language,scala-compiler,Scala,Compiler Construction,Code Translation,Intermediate Language,Scala Compiler,我想开发一个工具,一旦scala编译器完成了所有繁重的工作,就可以对scala程序进行后期处理。据我所知,Scala编译器的不同阶段逐步简化了程序的语法和高级功能,如lambdas、闭包、模式匹配等,我注意到,所谓的清理阶段(代码生成之前的最后一个阶段)看起来像scala,但实际上不是scala 是否有人亲自知道或可以向我指出一个资源,可以帮助我理解清理阶段产生的语言 举个例子,在清理阶段的输出中,我看到如下内容: case <synthetic> val x1: Foo$Bar =

我想开发一个工具,一旦scala编译器完成了所有繁重的工作,就可以对scala程序进行后期处理。据我所知,Scala编译器的不同阶段逐步简化了程序的语法和高级功能,如lambdas、闭包、模式匹配等,我注意到,所谓的清理阶段(代码生成之前的最后一个阶段)看起来像scala,但实际上不是scala

是否有人亲自知道或可以向我指出一个资源,可以帮助我理解清理阶段产生的语言

举个例子,在清理阶段的输出中,我看到如下内容:

case <synthetic> val x1: Foo$Bar = l;
  case9(){
    if (...some condition...)
      matchEnd8(scala.Predef.Set().empty())
    else
      case10()
  };
case val x1:Foo$Bar=l;
案例9(){
如果(…某些条件…)
matchEnd8(scala.Predef.Set().empty())
其他的
案例10()
};
我的假设是,这是转换模式匹配的结果,但据我所知,它看起来不像是有效的scala语法(我根本不是一个有经验的scala开发人员!)


我想这一切都归结到这一点:是否可以将清理阶段的输出转换为有效的可编译的scala代码?

一般来说,在scalac编译器的任何阶段(即使在解析之后),编译器使用的内部表示不再是有效的scala代码。这主要是因为标签和goto的存在,你发现了它们

形式的结构

labelName(...params){
  ...
}
labelName(...args)
是一个标签定义,是对表单的调用

labelName(...params){
  ...
}
labelName(...args)
跳转到该标签,将
…args
分配给
…params

scalac(和dotc,但具有不同的表示)使用标签和goto来表示
while
do..while
循环(解析后立即),转换
match
es和尾部递归优化函数


一般来说,没有办法从内部表示返回到有效的Scala代码,特别是在管道中的
清理之后

非常感谢,这非常有用!一般来说,是否有一个资源或论坛/社区可以让我获得有关此类问题的答案(即有关scala编译器内部的问题)?