2008-10-17 37 views
15

È attualmente possibile tradurre il codice C# in un Abstract Syntax Tree?Traduci codice C# in AST?

Modifica: alcuni chiarimenti; Non mi aspetto necessariamente che il compilatore generi l'AST per me - un parser andrebbe bene, anche se mi piacerebbe usare qualcosa di "ufficiale". Sfortunatamente le espressioni Lambda non saranno sufficienti dato che non mi permettono di usare i corpi di istruzioni, che è quello che sto cercando.

+0

Mi chiedo come va il tentativo di tradurre il codice C# in AST? – yeeen

+0

Ho messo il progetto in attesa. –

+4

Sospensione a lungo termine ... Lol –

risposta

17

Il progetto Roslyn è in Visual Studio 2010 e offre accesso programmatico allo Syntax Tree, tra le altre cose.

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

Stavo per postare questo come una risposta alla mia stessa domanda, ma mi hai battuto per questo. =) –

6

Verificare supporto .NET CodeDom. C'è un vecchio articolo sul progetto di codice per un C# CodeDOM parser, ma non supporterà le nuove funzionalità linguistiche.

È inoltre previsto il supporto in #develop per la generazione di un albero CodeDom dal codice sorgente C# in base a questo posting.

0

Vedere il progetto R # (mi dispiace che i documenti siano in russo, ma ci sono alcuni esempi di codice). Permette le manipolazioni AST sul codice C#. SVN

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

del progetto è here: (URL aggiornato, grazie, derigel)

Inoltre si prega di vedere la lingua Nemerle. È un linguaggio .Net con un forte supporto per metaprogrammazione.

+0

Il repository è ora disponibile all'indirizzo http://svn.rsdn.ru/svn/RSharp/ – derigel

12

È attualmente possibile convertire il codice C# in un Abstract Syntax Tree?

Sì, banalmente in circostanze particolari (= utilizzando il nuovo Expressions framework):

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

Questo crea un albero di espressione per la lambda, vale a dire una funzione di prendere un int e restituendo il doppio. È possibile modificare l'albero di espressione utilizzando il framework espressioni (= le classi da in quel namespace) e quindi compilarlo in fase di esecuzione:

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 

Si noti che tutte le espressioni sono immutabili in modo da avere per essere costruito di nuovo da composizione. In questo caso, ho aggiunto un'aggiunta di 1.

Si noti che questi alberi di espressione funzionano solo su espressioni reali, ad esempio il contenuto trovato in una funzione C#. Non è possibile ottenere alberi di sintassi per costrutti superiori come le classi in questo modo. Usa il framework CodeDom per questi.

+0

Erik ha accettato questo? Usa le forme lambda che ha detto di non volere. –

+1

Ira: dovresti prestare attenzione allo sviluppo della discussione. Questa voce è stata pubblicata * prima * Modifica/chiarimento di Erik. Apparentemente, nessuna delle altre risposte era migliore * all'epoca * (avviso: * un anno fa! *), Quindi non accettò un'altra risposta. La tua risposta è probabilmente ciò che avrebbe voluto. –

2

Sembra che questo tipo di funzionalità sarà incluso in tutto ciò che viene dopo C# 4, in base a Anders Hejlsberg's 'Future of C#' PDC video.

+0

Questo è utile per vedere cosa C# non offre una libreria per noi per manipolare l'API C#. È dovuto al suo compilatore è un classico, una scatola nera! – yeeen

2

Il ANTLR Parser Generator ha una grammatica per C# 3.0 che copre tutto tranne la sintassi LINQ.

+0

Ho usato ANTLR in passato, ed è abbastanza carino. Non ho usato la grammatica C#, ma la maggior parte dei contributori ci sono abbastanza cluey. – Travis

1

Il nostro C# front end for DMS analizza C# 3.0 completo incluso LINQ e produce AST. Il DMS, infatti, è un ecosistema per l'analisi/trasformazione del codice sorgente che utilizza gli AST per i linguaggi forniti front-end.

EDIT 3/10/2010: ... Ora gestisce completo C# 4.0

EDIT: 2014/06/27: Maniglie C# 5.0 dal bel po '.

MODIFICA: 15/06/2016: Gestisce C# 6.0. Vedi https://stackoverflow.com/a/37847714/120163 per un esempio AST.

+0

2004? Immagino il 2010. – Cheeso

+0

@Cheeso: Hmm, 2004 vorremmo dire che abbiamo raccolto MS. Beh, non lo fa mai per suggerirlo, quindi l'ho modificato diciamo 2010. Risolto. –

1

E 'strano che nessuno ha suggerito hacking del Mono compilatore C# esistenti.

3

Personalmente, vorrei utilizzare NRefactory, che è gratuito, open source e guadagni di popolarità.