9
votes

Construire son propre compilateur C # à l'aide d'AntlR: Unité de compilation

public class compilation_unit_return : ParserRuleReturnScope
    {
        private object tree;
        override public object Tree
        {
            get { return tree; }
            set { tree = (object) value; }
        }
    };

0 commentaires

3 Réponses :


3
votes

Je n'ai jamais travaillé avec Antlr de C #, mais en suivant votre lien vers API, Basetree n'est clairement pas une interface - c'est un classe , et il dispose de propriétés publiques: Type Pour obtenir le type de nœud, Texte Pour obtenir (je suppose) le texte source correspondant à celui-ci et enfants pour obtenir les nœuds d'enfant. Quoi d'autre avez-vous besoin de le marcher?


2 commentaires

C'est une classe abstraite ... Classe abstraite publique Basetreeeeeeeee: itree


Eh bien oui, et pourquoi cela vous empêcherait-il? Vous avez le nœud racine de l'arbre, que vous savez être d'un type qui a toutes les méthodes nécessaires à la récupération de ses enfants (et de parcourir ainsi l'arbre à n'importe quelle profondeur).



-2
votes

Si j'allais faire un compilateur C # aujourd'hui, voici ce que je voudrais faire essayer comme première tentative:

  1. Commencez par la cible ANTLR C # 3 (bien sûr, je suis biaisé ici - sérieusement, vous pouvez utiliser la cible CSHARP2 ou CSHARP3).
  2. Obtenez Visual Studio 2010 avec le .NET Framework 4. La clé est ici .net 4 et c'est doux de nouveaux arbres d'expression.
  3. Construisez un analyseur combiné de base. Mettre comme peu de logique dans l'analyseur aussi absolument possible. Il devrait avoir peu d'actions (le cas échéant), et la sortie doit être une AST non décontractée pouvant être marchée avec LL (1) Walker.
  4. Construisez une grammaire d'arbre pour marcher sur l'arbre et identifier tous les types déclarés. Il devrait également conserver les sous-arbres membre_declaration pour une utilisation ultérieure.
  5. Construire un arbre walker qui marche un seul membre_declaration et ajoute le membre au typeBuilder . Gardez une trace des corps de la méthode mais ne les promenez pas encore.
  6. Construisez un arbre Walker qui marche du corps d'une méthode. Générez un expression correspondant à la méthode et utilisez le compilétomethod méthode My propre API (voir Pavel et mes commentaires) pour générer le code IL.

    Si vous faites des choses dans cette commande, alors lorsque vous analysez enfin les expressions (organes de méthodes, initialisateurs de champ), vous pouvez utiliser les méthodes string Comme celui-ci dans le expression classe pour enregistrer des membres résolvant le travail .


6 commentaires

Malheureusement, compiletomethod ne peut vraiment pas être utilisé dans ce scénario en raison de ses limitations inhérentes - il n'y a aucun moyen de compiler dans un code à une autre méthode que vous générez à côté et la cible Methodbuilder doit être pour une méthode statique uniquement. Voir connect.microsoft.com/visualstudio/feedback/.../a> pour plus de détails.


Joli. Eh bien, alors je commencerais en construisant un compilateur expression qui fonctionne dans ces cas, puis utilisez cela à la place. :) Je conserverais le compilateur expression en tant que module indépendant afin qu'il puisse être utilisé avec d'autres projets (et peut-être que je le ferai de toute façon pour vous amuser).


Peut-être juste pour dévier un peu de mon QN ci-dessus: j'ai le code source pour AntLR-3.1.3. N Dans le dossier Runtime, il y a 2 dossiers - Csharp N CSharp3. Depuis que tu as mentionné Abt Csharp3, tu sais pourquoi il y a 2 dossiers? Cependant, l'API fournie en ligne semblait être réservée à CSHARP uniquement CSHARP3, également la DLL compilée également. Si quelqu'un veut utiliser csharp3, il doit compiler les codes là-bas lui-même? Pour moi, il semble que Csharp3 ait des fonctionnalités plus avancées, mais pas vraiment pertinentes dans mon contexte.


Je ne suis pas trop sûr de ce qui se passe dans la discussion BTN U et Pavel Minaev. La conclusion de votre discussion est donc que les étapes que les étapes que vous avez ci-dessus ne soient pas fonctionnelles?


Initialement, je veux juste utiliser un API équivalent à " help.eclipse.org/help33/index.jsp?topic=/... " en Java pour atteindre le transversal de JETER. Malheureusement de ce que j'ai recherché, l'API actuelle fournie par C # Compiler est une boîte noire, ne pas avoir la fonctionnalité TT permet de manipuler son AST. J'ai donc dû sortir avec mon propre compilateur, TT's's's's's's's's a choisi d'utiliser des antlr ..., espérons-le, vous ou quelqu'un d'autre, faites des façons HV de résoudre mes doutes. Je reçois des moyens de bienvenue plus rapides que d'utiliser AntlR (c'est-à-dire un compilateur C # existant TT).


Cela ne répond pas vraiment à la question à propos de AntLR, il s'agit simplement d'un ensemble d'étapes de la manière dont vous approcheriez de construire un compilateur, qui est une question totalement différente.



6
votes

Vous pouvez définir le type d'arborescence AST dans vos options de grammaire en haut du fichier, comme: XXX

Je construirais une 3ème grammaire ou travaillez-la dans votre grammaire d'analyseur existante qui tourne l'arbre dans des classes que vous créez. Par exemple, supposons que vous ayez une règle qui correspond à l'opérateur plus et c'est 2 arguments. Vous pouvez définir une règle correspondant à cet arbre qui crée une classe que vous avez écrite, appelons-le plusexpression comme ceci: xxx

EXPR serait une autre règle dans vos expressions correspondantes de grammaire . gauche et droite ne sont que des alias donnés aux valeurs de l'arbre. La pièce entre le {} 's est à peu près transformée en code C # Verbatim, à l'exception du remplacement des références variables. La propriété .Value off de $ à gauche et à droite $ provient du retour spécifié des règles créées à partir de.


0 commentaires