Как взаимодействовать с компилятором в самом коде Scala? - PullRequest
6 голосов
/ 09 декабря 2011

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

Есть ли какой-нибудь способ синтаксического анализа кода, построения абстрактного синтаксического дерева или использования библиотеки для компиляции кода во время выполнения?

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

Некоторое время назад я использовал (теперь исключенный) класс scala.tools.nsc.Interpreter для загрузки, изменения и - неожиданности! интерпретировать код Scala во время выполнения. Если вы хотите обмениваться значениями между вашим и интерпретируемым кодом, взгляните на его метод bind. Он также имеет метод compileSources и compileString, но я до сих пор не использовал один из них. Также я ничего не знаю о том, как использовать это (или что-то еще), чтобы получить AST.

См. Также: Какова цель пакета scala.tools.nsc? и пакета nsc scaladoc .

Обновление: это должно ответить на вопрос AST (с 2009 года может быть устаревшим): Scala AST в Scala

1 голос
/ 10 декабря 2011
1 голос
/ 10 декабря 2011

Я делал это в прошлом, создав новый экземпляр CompilerCommand для анализа аргументов командной строки и, что более важно, расширив класс Global .

Переопределив метод computeInternalPhases, вы можете использовать только некоторые фазы компилятора (например, до refchecks, чтобы использовать его только в качестве анализатора / проверки типов), и вы можете добавлять свои собственные фазы (плагины) каквы ожидаете.Конечно, вы можете пройти весь путь до генерации файлов классов.

Так что да, это определенно возможно.В конце концов, сам компилятор также работает на JVM.

...