我正在尝试为演示项目构建静态分析工具。我们可以自由选择要分析的语言。我从使用ANTLR编写Java代码分析器开始。我现在想对Scala代码做同样的事情。但是,我找不到Scala的ANTLR语法。它存在吗? Scala语法还有其他机器可读的形式吗?
答案 0 :(得分:11)
我不相信有这样的事情。
对于任何语言,但尤其是对于像Scala这样的库语言来说,词法分析和句法分析是静态分析中最不有趣和最微不足道的部分。为了做任何远程有趣的事情,你需要执行大量的语义分析:desugaring,类型推断,类型检查,种类检查,宏扩展,重载解析,隐式解析,名称绑定。简而言之:您需要重新实现或多或少的整个Scala编译器,以实际代码生成部分为模。请记住,Scala的宏系统和Scala的类型系统都是Turing-complete(事实上,Scala的宏系统是 Scala!):可能会有大量的编译时和类型级计算正在进行中<如果没有实际执行宏扩展,类型推断和类型检查,则不可能进行分析。
这是一个大规模任务,实际上只有两个项目成功完成了:一个是Scala编译器本身,另一个是IntelliJ IDEA Scala插件。
让我们甚至不谈论编译器插件,它能够以几乎任意的方式改变Scala的语法和语义。
但是,有希望:Scala编译器本身提供了一个名为 Presentation Compiler 的API,它专门设计用于IDE,代码高亮显示器和各种静态分析工具。它使您可以在编译期间,优化和代码生成阶段之前访问编译器所具有的全部信息。它由ScalaDoc,Scala REPL,Scala Eclipse插件,NetBeans Scala插件,SimplyScala.Com,Emacs的ENSIME插件,一些静态分析工具以及许多其他工具使用。
答案 1 :(得分:8)
您可以在https://github.com/lrlucena/grammars-v4/tree/master/scala找到ANTLR的Scala语法。它基于Scala语言规范http://www.scala-lang.org/files/archive/spec/2.11/13-syntax-summary.html。
答案 2 :(得分:2)
Scala Language Reference的附录A对您有用吗?它采用EBNF格式。
答案 3 :(得分:1)
Scalastyle使用scalariform对其进行解析。有了这个,你得到一个案例类的AST。但是,您只获取文件中的信息,因此,例如,您不会获得推断类型。
如果您不需要所有额外信息,请查看Scalariform。 Scalastyle代码相当容易理解,从Checker.scala开始。