Цейлонский типограф: как получить типизированное синтаксическое дерево?
Я пытаюсь программно использовать / встраивать 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()
,