2012-09-11 85 views
10

我正在尝试构建演示项目的静态分析工具。我们可以自由选择要分析的语言。我开始使用ANTLR编写Java代码分析器。我现在想为Scala代码做同样的事情。但是,我找不到Scala的ANTLR语法。它存在吗? 有没有其他机器可读的Scala语法形式?斯卡拉的ANTLR语法?

回答

10

我不相信有这样的事情。

的事情是,对于任何语言,但像斯卡拉库语言尤其是,词法分析,句法分析是静态分析的最有趣,最微不足道的一部分。为了做任何事情,甚至远程有趣的,你需要执行大量的语义分析:desugaring,类型推断,类型检查,类型检查,宏扩展,重载解析,隐式解析,名称绑定。简而言之:您需要重新实现或多或少的整个Scala编译器,模仿实际的代码生成部分。请记住,Scala的宏系统和Scala的类型系统都是图灵完整的(实际上,Scala的宏系统斯卡拉!):可能有重要的编译时和类型级计算正在进行,即不可能无需分析实际上执行宏扩展,类型推断和类型检查。

这是一个巨大的任务,而且实际上只有两个项目已经成功做到了:一个是Scala编译器本身,另一种是IntelliJ IDEA的斯卡拉插件。

我们甚至不谈论编译器插件,它们能够以任意方式改变Scala的语法和语义。

但是,看到希望:Scala编译器本身提供了一个名为演示编译器的API,它专门用于IDE,代码荧光笔和各种静态分析工具。它使您能够在编译期间访问编译器的全部信息,就在优化和代码生成阶段之前。它被ScalaDoc,Scala REPL,Scala Eclipse插件,NetBeans Scala插件,SimplyScala.Com,Emacs的ENSIME插件,一些静态分析工具等等所使用。

+0

感谢您的信息发布。 – Jus12

+1

实际上,Scalastyle使用scalariform,它为它解析。看到我的答案。 –

+0

@MthetheWFarwell:谢谢你的信息。我已经更新了我的答案。 (旁注:https://github.com/mdr/scalariform/blob/master/scalariform/src/main/scala/scalariform/parser/ScalaParser.scala看起来可怕:-)) –

2

Scala Language Reference的附录A对您有用吗?它采用EBNF格式。

+1

它有点用处。我会更喜欢机器可读的格式。我猜如果ANTLR语法不在身边,我们将不得不使用EBNF来创建它。 – Jus12

+3

您可以在Antlr中为EBNF编写语法,解析它然后将其转换为Antlr? :) – ron

+0

多数民众赞成在太多的工作:) – Jus12

1

Scalastyle使用scalariform来解析它。有了这个,你可以得到一个案例类的AST。但是,您只能获取文件中的信息,例如,您不会得到推断的类型。

如果你不需要所有的额外信息,那么看看Scalariform。 Scalastyle代码相当容易理解,从Checker.scala开始。

8
+1

语法是完全愚蠢的。不适用于antlr4。我发布了一个问题在stackoverflow和人们说,它从来没有被测试过。这里是链接:http://stackoverflow.com/questions/40482259/antlr-doesnt-give-correct-output-tokens-for-scala-grammar – shiva

+0

https://github.com/lrlucena/grammars-v4/tree/master/scala这个语法不起作用。 – Ryan