public class compilation_unit_return : ParserRuleReturnScope { private object tree; override public object Tree { get { return tree; } set { tree = (object) value; } } };
3 Réponses :
Je n'ai jamais travaillé avec Antlr de C #, mais en suivant votre lien vers API, Basetree code> n'est clairement pas une interface - c'est un classe , et il dispose de propriétés publiques:
Type code> Pour obtenir le type de nœud,
Texte Code> Pour obtenir (je suppose) le texte source correspondant à celui-ci et
enfants code> pour obtenir les nœuds d'enfant. Quoi d'autre avez-vous besoin de le marcher? P>
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).
Si j'allais faire un compilateur C # aujourd'hui, voici ce que je voudrais 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 code> string code> Comme celui-ci dans le faire del> essayer comme première tentative: p>
membre_declaration code> et ajoute le membre au
typeBuilder code>
. Gardez une trace des corps de la méthode mais ne les promenez pas encore. Li>
expression
correspondant à la méthode et utilisez le compilétomethod code>
méthode del> My propre API (voir Pavel et mes commentaires) pour générer le code IL. LI>
ol>
expression code>
classe pour enregistrer des membres résolvant le travail . P>
Malheureusement, compiletomethod code> 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 code> 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 code> expression code> qui fonctionne dans ces cas, puis utilisez cela à la place. :) Je conserverais le compilateur code> expression code> 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.
Vous pouvez définir le type d'arborescence AST dans vos options de grammaire en haut du fichier, comme: 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: p> 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. P> p>