Question

Est-il actuellement possible de traduire le code C # en un arbre de syntaxe abstraite?

Edit: quelques éclaircissements; Je ne m'attends pas nécessairement à ce que le compilateur génère l'AST pour moi - un analyseur syntaxique conviendrait, bien que j'aimerais utiliser quelque chose d '"officiel". Les expressions lambda ne seront malheureusement pas suffisantes car elles ne me permettent pas d’utiliser des corps d’énoncé, ce que je recherche.

Était-ce utile?

La solution

Le projet Roslyn est dans Visual Studio 2010 et vous permet d'accéder par programmation au < a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Arbre de syntaxe , entre autres.

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;

Autres conseils

  

Est-il actuellement possible de traduire le code C # en un arbre de syntaxe abstraite?

Oui, de manière triviale dans des circonstances spéciales (= en utilisant le nouveau Framework d'expressions ):

// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;

Ceci crée un arbre d’expression pour le lambda, c’est-à-dire une fonction prenant un int et renvoyant le double. Vous pouvez modifier l'arborescence d'expression à l'aide du framework Expressions (= les classes de cet espace de noms), puis le compiler au moment de l'exécution:

var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11

Notez que toutes les expressions sont immuables, elles doivent donc être reconstruites par composition. Dans ce cas, j'ai ajouté un supplément de 1.

Notez que ces arbres d’expression ne fonctionnent que sur les expressions réelles, c’est-à-dire le contenu d’une fonction C #. Vous ne pouvez pas obtenir des arbres de syntaxe pour les constructions supérieures telles que les classes de cette façon. Utilisez le framework CodeDom pour ces applications.

Consultez le CodeDom du support .NET. Il existe un ancien article sur le projet de code pour un analyseur CodeDOM C # , mais il a gagné ne supporte pas les nouvelles fonctionnalités linguistiques.

Il est également supposé que #develop prenne en charge la génération d’une arborescence CodeDom à partir du code source C #, conformément à cette publication .

Il y a beaucoup plus puissant que le projet R #. Nemerle.Peg:

https://code.google .com / p / nemerle / source / parcourir / nemerle / trunk / snippets / peg-parser /

Et il a un analyseur C # qui analyse tout le code C # et le traduit en AST!

https://code.google .com / p / nemerle / source / parcourir / nemerle / trunk / snippets / csharp-parser /

Vous pouvez télécharger le programme d'installation ici: https://code.google.com/p/nemerle/

Personnellement, j’utiliserais NRefactory , qui est gratuit, en open source et gagne en popularité.

Il semble que ce type de fonctionnalité sera inclus dans tout ce qui viendra après C # 4, selon Anders La vidéo PDC de Hejlsberg intitulée "L'avenir de C #" .

Le Générateur d'analyseur ANTLR possède une grammaire pour C # 3.0 qui couvre tout, sauf la syntaxe LINQ.

Je viens de répondre sur un autre sujet, ici, chez StackOverflow, une solution dans laquelle j'ai implémenté une API pour créer et manipuler AST à partir du code source C #

Il est étrange que personne n'ait suggéré de pirater le compilateur Mono C # existant.

Notre le frontal C # pour DMS analyse intégralement le C # 3.0, y compris LINQ et produit des AST. DMS est en fait un écosystème pour analyser / transformer le code source en utilisant des AST pour les langages fournis en amont.

EDIT 3/10/2010: ... gère désormais l'intégralité de C # 4.0

EDIT: 27/06/2014: gère C # 5.0 depuis assez longtemps.

EDIT: 15/06/2016: Manipulation C # 6.0. Voir https://stackoverflow.com/a/37847714/120163 pour un exemple d'AST.

ANTLR n'est pas très utile. LINQ n’est pas ce que vous voulez.

Essayez Mono.Cecil! http://www.mono-project.com/Cecil

Il est utilisé dans de nombreux projets, y compris NDepend! http://www.ndepend.com/

S'il vous plaît voir le projet R # (désolé les documents sont en russe, mais il y a quelques exemples de code). Il permet des manipulations AST sur du code C #.

http://www.rsdn.ru/projects/rsharp/article /rsharp_mag.xml

Le SVN du projet est ici : (URL mise à jour, merci, derigel )

Consultez également le langage Nemerle . C’est un langage .Net qui supporte fortement la métaprogrammation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top