Ответ 1
Я бы подумал, что лучший способ получить доступ к AST - это плагин для компилятора. Вы должны прочитать мягкое введение перед дайвинг в глубину.
Существует ли библиотека Scala, которая анализирует Scala и создает абстрактное дерево синтаксиса (AST)?
В идеале меня интересует библиотека Scala. План B будет представлять собой библиотеку Java.
(Я знаю, что я мог бы использовать EBNF из Scala Резюме синтаксиса.)
Я бы подумал, что лучший способ получить доступ к AST - это плагин для компилятора. Вы должны прочитать мягкое введение перед дайвинг в глубину.
Несколько существующих парсеров:
PsiBuilder
.Будьте осторожны при использовании EBNF из спецификации, очевидно:
"несовпадения между приложением и встроенной грамматикой и несоответствия между языком, скомпилированным с помощью scalac (и используемым в источниках Scala), и языком, заявленным грамматикой" - Scala Ошибка TraС# 1826.
Вы не можете построить AST для Scala только из грамматики. Там подразумевается рассмотреть, и, чтобы рассмотреть их, существует тип, который должен быть рассмотрен.
Вы можете, однако, вызвать сам компилятор - это всего лишь файл jar. Scala 2.8, в частности, имеет довольно много перехватов для других программ, чтобы защелкнуть работу Майлза Сабина, который делает это именно так, чтобы плагин Eclipse для Scala мог использовать такой компилятор.
Я предлагаю вам перейти в список рассылки Scala Tools и связаться с людьми там.
Вот проект одного компилятора компилятора http://github.com/paulp/scala-lang-combinators
Если вы хотите создать AST для части кода. Вы можете использовать отражение scala:
showRaw(reify{
//your code here like:
print(2)
})
В приведенном выше коде будет генерироваться AST:
Expr(Apply(Select(Ident(scala.Predef), TermName("print")), List(Literal(Constant(2)))))
Ссылка:
http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html
Не уверен в чистых решениях scala, но если вам нужно реализовать план B, вы можете начать с проверки ANTLR или Крысы!