Ceylon Typechecker: как получить типизированное синтаксическое дерево?

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

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

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

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

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

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

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

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

Итак, есть 3 AST: 1. Созданный antlr, 2. ceylon.ast.core и 3. ceylon.ast.redhat. Почему?


person Michael    schedule 08.02.2016    source источник


Ответы (1)


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

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

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

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

person John Vasileff    schedule 08.02.2016
comment
Хорошо, я добавил детали к последней пуле. Вы, конечно, можете обрабатывать Tree.CompilationUnit по своему усмотрению: переключатель, посетитель или что-то еще. Вы также можете преобразовать AST на основе Java в основанный на Цейлоне ceylon.ast, как я сделал для бэкэнда Dart. - person John Vasileff; 09.02.2016