2011-10-19 23 views

回答

14

让我来简单一点:没有办法单独使用解析器生成Scala程序的AST。运行typer是绝对必要的,这意味着类型推理和暗示。

之后,你可以做任何你想做的事情。但编译器的前几个阶段(最新版本中有四个阶段,计算typer)是必要的。

巧合的是,这是使用的presentation compiler运行的阶段。在我看来,这可能是您完美的界面。

ENSIMEuses it,这似乎是最好的信息来源,你也可能想看看Scala Refactoring工具,因为它也使用编译器的AST。

最后,您可以尝试使用-Ybrowse:typer编译代码以查看typer后的树。使用-Xshow-phases显示现有阶段,或使用-Xprint:typer在typer(或任何其他阶段)之后打印“源”。

+1

我认为你的基本答案是误导。如果你有一个语法,你可以生成一个AST;毕竟,语法和(语法)树是关于纯语法的。我同意,你经常需要类型信息来有效地解释AST。 (我不反对你指向有用机器的指针)。 –

+1

@Ira假设语言可以用语法_parsed_。例如,Perl [不能](http://www.perlmonks.org/?node_id=663393)。在斯卡拉,陪审团仍然没有 - 有些人试图根据规范EBNF构建解析器,但发现它并不完美。也许Scala可以从语法中解析出来,但是实际上,任何这样的解析都是无用的,因为源代码的一部分是由该阶段隐式提供的。 –

+0

同样的故事也被告知了C++。这是错误的。事实是,某些解析可能在本地不明确。他们甚至可能在本地高度模糊。大多数情况下,这意味着人们使用的解析技术(LL(k)和LALR(1))非常糟糕。这并不意味着正确的解析技术是糟糕的。请参阅GLR解析,它可以使用aplomb处理这些混淆。尽管存在关于“很难”的民间定理,我们仍然用这种方式解析C++。我们正在开发一个Perl解析器,但是它的后台烧录器。我很难相信Scala和Perl一样令人讨厌。 –