ANTLR для Scala?

Я пытаюсь создать инструмент статического анализа для демонстрационного проекта. Мы можем свободно выбирать язык для анализа. Я начал с написания анализатора кода Java с помощью ANTLR. Теперь я хочу сделать то же самое для кода Scala. Однако я не мог найти грамматику ANTLR для Scala. Он существует? Есть ли другая машиночитаемая форма грамматики Scala?

Ответ 1

Я не верю, что есть такая вещь.

Дело в том, что для любого языка, но особенно для языка библиотеки, такого как Scala, лексический анализ и синтаксический анализ являются наименее интересной и самой тривиальной частью статического анализа. Чтобы сделать что-нибудь даже отдаленно интересное, вам нужно выполнить значительный семантический анализ: desugaring, вывод типа, проверка типов, проверка вида, расширение макросов, разрешение перегрузки, неявное разрешение, привязка имени. Короче: вам нужно повторно внедрить более или менее весь компилятор Scala, по модулю фактической части генерации кода. Помните, что как макросистемы Scala, так и система типа Scala являются Turing-complete (на самом деле, Scala макросистема Scala!): Может произойти значительное вычисление времени компиляции и уровня на уровне, невозможно проанализировать без фактического выполнения расширения макросов, вывода типа и проверки типов.

Это огромная задача, и на самом деле есть только два проекта, которые успешно выполнили ее: один - это компилятор Scala, другой - плагин IntelliJ IDEA Scala.

И даже не рассказывайте о плагинах компилятора, которые могут изменять почти синтаксис и семантику Scala почти любыми способами.

Но вот, есть надежда: сам компилятор Scala предоставляет API, называемый компилятором презентаций, который специально разработан для использования IDE, обозревателями кода и всеми видами инструментов статического анализа. Он дает вам доступ ко всей информации, которую компилятор имеет во время компиляции, непосредственно перед этапами оптимизации и генерации кода. Он используется ScalaDoc, Scala REPL, плагин Scala Eclipse, плагин NetBeans Scala, SimplyScala.Com, плагин ENSIME для Emacs, некоторые инструменты статического анализа и многие другие.

Ответ 3

Полезно ли вам приложение A справочника Scala Language Reference? Он находится в формате EBNF.

Ответ 4

Scalastyle использует scalariform, чтобы выполнить синтаксический анализ. При этом вы получаете AST класс case. Однако вы получаете только информацию, которая находится в файле, поэтому, например, вы не получаете выводимых типов.

Если вам не нужна вся дополнительная информация, посмотрите на Scalariform. Код Scalastyle достаточно прост для понимания, начиная с Checker.scala.