Цейлонский типограф: как получить типизированное синтаксическое дерево?

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

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

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

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

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

С моей стороны была (и есть) некоторая путаница по поводу трех различных AST.

В README на ceylon /ceylon.ast сказано:

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

Итак, есть 3 AST: 1. Генерируемый antlr, 2. ceylon.ast.core и 3. ceylon.ast.redhat. Зачем?

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам