我正在尝试构建演示项目的静态分析工具。我们可以自由选择要分析的语言。我开始使用ANTLR编写Java代码分析器。我现在想为Scala代码做同样的事情。但是,我找不到Scala的ANTLR语法。它存在吗? 有没有其他机器可读的Scala语法形式?斯卡拉的ANTLR语法?
回答
我不相信有这样的事情。
的事情是,对于任何语言,但像斯卡拉库语言尤其是,词法分析,句法分析是静态分析的最有趣,最微不足道的一部分。为了做任何事情,甚至远程有趣的,你需要执行大量的语义分析:desugaring,类型推断,类型检查,类型检查,宏扩展,重载解析,隐式解析,名称绑定。简而言之:您需要重新实现或多或少的整个Scala编译器,模仿实际的代码生成部分。请记住,Scala的宏系统和Scala的类型系统都是图灵完整的(实际上,Scala的宏系统是斯卡拉!):可能有重要的编译时和类型级计算正在进行,即不可能无需分析实际上执行宏扩展,类型推断和类型检查。
这是一个巨大的任务,而且实际上只有两个项目已经成功做到了:一个是Scala编译器本身,另一种是IntelliJ IDEA的斯卡拉插件。
我们甚至不谈论编译器插件,它们能够以任意方式改变Scala的语法和语义。
但是,看到希望:Scala编译器本身提供了一个名为演示编译器的API,它专门用于IDE,代码荧光笔和各种静态分析工具。它使您能够在编译期间访问编译器的全部信息,就在优化和代码生成阶段之前。它被ScalaDoc,Scala REPL,Scala Eclipse插件,NetBeans Scala插件,SimplyScala.Com,Emacs的ENSIME插件,一些静态分析工具等等所使用。
是Scala Language Reference的附录A对您有用吗?它采用EBNF格式。
Scalastyle使用scalariform来解析它。有了这个,你可以得到一个案例类的AST。但是,您只能获取文件中的信息,例如,您不会得到推断的类型。
如果你不需要所有的额外信息,那么看看Scalariform。 Scalastyle代码相当容易理解,从Checker.scala开始。
您可以在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。
- 1. 斯卡拉Unicode的语法
- 2. 斯卡拉语法青鱼
- 3. 斯卡拉功能语法
- 4. 斯卡拉RedBlackTree语法
- 5. 斯卡拉外=>语法
- 6. 斯卡拉特质语法
- 7. 斯卡拉语法错误?
- 8. 斯卡拉语法糖
- 9. 斯卡拉 - 谓语
- 10. 火花和斯卡拉的语法
- 11. DSL类似的语法在斯卡拉
- 12. 斯卡拉匿名函数语法
- 13. 斯卡拉点语法(或缺乏)
- 14. 斯卡拉反射AST语法
- 15. 斯卡拉喷雾路由语法
- 16. 斯卡拉占位符语法
- 17. 斯卡拉语法帮助柯里
- 18. 成语斯卡拉办法从列表
- 19. 困惑这个斯卡拉语法
- 20. 斯卡拉矢量倍语法(/:和:\和/:\)
- 21. 斯卡拉阶乘语法错误
- 22. 斯卡拉方式/成语
- 23. 斯卡拉playframework if语句
- 24. 斯卡拉在case语句
- 25. 斯卡拉:_的
- 26. 斯卡拉在斯卡拉类
- 27. 斯卡拉的理解`if`语句
- 28. 斯卡拉抽象性状的语义
- 29. 部分模型的斯卡拉成语?
- 30. 列手法斯卡拉
感谢您的信息发布。 – Jus12
实际上,Scalastyle使用scalariform,它为它解析。看到我的答案。 –
@MthetheWFarwell:谢谢你的信息。我已经更新了我的答案。 (旁注:https://github.com/mdr/scalariform/blob/master/scalariform/src/main/scala/scalariform/parser/ScalaParser.scala看起来可怕:-)) –