6
我需要从Scala创建转换器到另一种语言。我正在寻找scala代码解析器,它将代码转换为语法树而无需编译。Scala代码解析器(不是编译器)
我需要从Scala创建转换器到另一种语言。我正在寻找scala代码解析器,它将代码转换为语法树而无需编译。Scala代码解析器(不是编译器)
让我来简单一点:没有办法单独使用解析器生成Scala程序的AST。运行typer是绝对必要的,这意味着类型推理和暗示。
之后,你可以做任何你想做的事情。但编译器的前几个阶段(最新版本中有四个阶段,计算typer)是必要的。
巧合的是,这是使用的presentation compiler运行的阶段。在我看来,这可能是您完美的界面。
ENSIME也uses it,这似乎是最好的信息来源,你也可能想看看Scala Refactoring工具,因为它也使用编译器的AST。
最后,您可以尝试使用-Ybrowse:typer
编译代码以查看typer后的树。使用-Xshow-phases
显示现有阶段,或使用-Xprint:typer
在typer(或任何其他阶段)之后打印“源”。
我认为你的基本答案是误导。如果你有一个语法,你可以生成一个AST;毕竟,语法和(语法)树是关于纯语法的。我同意,你经常需要类型信息来有效地解释AST。 (我不反对你指向有用机器的指针)。 –
@Ira假设语言可以用语法_parsed_。例如,Perl [不能](http://www.perlmonks.org/?node_id=663393)。在斯卡拉,陪审团仍然没有 - 有些人试图根据规范EBNF构建解析器,但发现它并不完美。也许Scala可以从语法中解析出来,但是实际上,任何这样的解析都是无用的,因为源代码的一部分是由该阶段隐式提供的。 –
同样的故事也被告知了C++。这是错误的。事实是,某些解析可能在本地不明确。他们甚至可能在本地高度模糊。大多数情况下,这意味着人们使用的解析技术(LL(k)和LALR(1))非常糟糕。这并不意味着正确的解析技术是糟糕的。请参阅GLR解析,它可以使用aplomb处理这些混淆。尽管存在关于“很难”的民间定理,我们仍然用这种方式解析C++。我们正在开发一个Perl解析器,但是它的后台烧录器。我很难相信Scala和Perl一样令人讨厌。 –