2016-02-08 2 views
4

Je suis en train d'essayer d'utiliser/incorporer par programmation le Ceech Typechecker pour analyser le code source de Ceylan. Dans ce cas d'utilisation, je veux accéder à toutes les informations que le compilateur devrait normalement consommer. Mais je ne vais pas compiler et je ne vais pas ajouter de dépendance sur le compilateur.Le Ceech Typechecker: Comment obtenir l'arbre de syntaxe typé?

Il me semble que le principal point d'entrée principal dans ceylon/typechecker/src/main/Main.java n'est pas le point d'entrée approprié pour ce cas d'utilisation (obtenir l'arbre typé et les modèles joints), parce que Les informations collectées par les visiteurs dans les trois badges sont supprimées et seules les erreurs sont imprimées.

Alors, ma question est:

Comment puis-je analyser et typer une unité de compilation puis obtenir 1. l'arbre de syntaxe typé et 2. les objets associés au modèle des types les visiteurs d'analyse rencontrés dans l'arbre, qui sont liés à partir de l'arbre.

modifié:

Il était (et est) une certaine confusion de mon côté sur les 3 différents RSHS il y a.

Dans le README dans Ceylon /ceylon.ast il est dit:

¨ ... ceylon.ast.core - les classes de Ceylan qui représentent un Ceylan AST. Pure Ceylan (indépendant du backend). ... ceylon.ast.redhat - transforme un AST de ceylon.ast.core de + vers un compilateur RedHat (AST de type ceylon, et contient également des fonctions pour compiler un AST de ceylon.ast.core à partir d'une chaîne de code (en utilisant . le compilateur RedHat) ... ¨

donc il y a 3 RSHS: 1. celui généré par antlr, 2. ceylon.ast.core et 3. ceylon.ast.redhat Pourquoi

.?

Répondre

5

En bref, vous aurez envie de:

  • Configurer un TypeCheckerBuilder avec les fichiers source que vous voulez typecheck,
  • Obtenir un TypeChecker du constructeur (builder.typechecker),
  • invoquons le typechecker (typeChecker.process()),
  • processus les résultats disponibles à partir typeChecker.phasedUnits. Plus précisément, typeChecker.getPhasedUnits().getPhasedUnits() vous donnera un List<PhasedUnit>, et pour chaque PhasedUnit, vous pouvez appeler getCompilationUnit() pour obtenir son Tree.CompilationUnit, qui est la racine de l'AST. Les nœuds AST incluent également des getters pour les objets du modèle.

Pour un exemple détaillé, vous pouvez consulter le code pour le backend Dart, travail avant et en arrière de the call to process() dans la fonction compileDart().

Voir testCompile par exemple code qui appelle compileDart().

+2

Ok, j'ai ajouté des détails à la balle finale. Vous êtes bien sûr libre de traiter le 'Tree.CompilationUnit's comme vous le souhaitez: switch, visiteur, ou autre chose. Vous pouvez également convertir l'AST basé sur Java en un Ceylan ['ceylon.ast'] (https://herd.ceylon-lang.org/modules/ceylon.ast.core), comme je l'ai fait pour le backend Dart. –