2016-02-08 4 views
4

Im пытается программным образом использовать/внедрять Ceylon Typechecker для анализа исходного кода Ceylon. В этом случае я хочу получить доступ ко всей информации, которую обычно потребляет компилятор. Но я не собираюсь компилировать, и я не собираюсь добавлять зависимость от компилятора.Ceylon Typechecker: Как получить типизированное дерево синтаксиса?

Мне кажется, что основная точка входа в ceylon/typechecker/src/main/Main.java не является подходящей точкой входа для этого варианта использования (получение типизированного дерева и присоединенных моделей), потому что это информация, которая была собрана посетителями в трех шагах проверки, отбрасывается, и печатаются только ошибки.

Итак, мой вопрос:

Как я могу разобрать и typecheck блока компиляции, а затем получить 1. типизированного синтаксиса дерева и 2. соответствующих модели объектов типов посетителей анализа сталкиваются в дерево, которое связано с деревом.

отредактирован:

Был (и есть) какая-то путаница с моей стороны о 3-х различном НРХЕ существует.

В README на Цейлоне /ceylon.ast сказано:

¨ ... ceylon.ast.core - классы Цейлон, которые представляют собой цейлонский AST. Чистый цейлон (независимый от бэкэнда). ... ceylon.ast.redhat - преобразует ceylon.ast.core AST из + в компилятор RedHat (ceylon-spec AST, а также содержит функции для компиляции ceylon.ast.core AST из строки кода (используя . RedHat компилятор) ... ¨

Так есть 3 НРХ: 1. один порожденный ANTLR, 2. ceylon.ast.core и 3. ceylon.ast.redhat Почему

.?

ответ

5

Короче говоря, вы хотите:

  • настроить TypeCheckerBuilder с исходными файлами, которые вы хотите typecheck,
  • Получить TypeChecker от застройщика (builder.typechecker),
  • Вызов (typeChecker.process() проверки типов),
  • обработки результатов можно приобрести у typeChecker.phasedUnits. В частности, typeChecker.getPhasedUnits().getPhasedUnits() предоставит вам List<PhasedUnit>, и для каждого PhasedUnit вы можете позвонить по телефону getCompilationUnit(), чтобы получить его Tree.CompilationUnit, который является корнем AST. Узлы AST также включают в себя геттеры для объектов модели.

Для подробного примера, вы можете просмотреть код серверной Dart, работая вперед и назад от the call to process() в функции compileDart().

См. testCompile, например код, который вызывает compileDart().

+2

Хорошо, я добавил детали к окончательной пуле. Конечно, вы можете обрабатывать 'Tree.CompilationUnit', как вам нравится: переключатель, посетитель или что-то еще. Вы также можете преобразовать АСТ на основе Java на основе цейлона ['ceylon.ast'] (https://herd.ceylon-lang.org/modules/ceylon.ast.core), как я сделал для бэкэнда Дарта. –