Domanda

Attualmente è possibile tradurre il codice C # in un albero di sintassi astratto?

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". Le espressioni lambda purtroppo non saranno sufficienti dato che non mi permettono di usare corpi di dichiarazione, che è quello che sto cercando.

È stato utile?

Soluzione

Il progetto Roslyn è in Visual Studio 2010 e ti dà accesso programmatico al < a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Albero di sintassi , tra le altre cose.

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

Altri suggerimenti

  

Attualmente è possibile tradurre il codice C # in un albero di sintassi astratto?

Sì, banalmente in circostanze speciali (= utilizzando il nuovo Framework delle espressioni ):

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

Questo crea un albero delle espressioni per lambda, cioè una funzione che prende un int e restituisce il doppio. È possibile modificare l'albero delle espressioni utilizzando il framework Espressioni (= le classi in quello spazio dei nomi) 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

Nota che tutte le espressioni sono immutabili, quindi devono essere costruite di nuovo per composizione. In questo caso, ho anteposto un'aggiunta di 1.

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

Scopri .NET CodeDom . Esiste un vecchio articolo sul progetto di codice per un parser C # CodeDOM , ma ha vinto non supporta le nuove funzionalità linguistiche.

Dovrebbe inoltre esserci supporto in #develop per la generazione di un albero CodeDom dal codice sorgente C # secondo questo pubblicazione .

C'è molto di più del progetto R #. Nemerle.Peg:

https://code.google .com / p / Nemerle / source / browse / Nemerle / trunk / snippets / PEG-parser /

E ha un parser C # che analizza tutto il codice C # e lo traduce in AST!

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

Puoi scaricare il programma di installazione qui: https://code.google.com/p/nemerle/

Personalmente, userei NRefactory , che è gratuito, open source e guadagna popolarità.

Sembra che questo tipo di funzionalità sarà inclusa in tutto ciò che viene dopo C # 4, secondo Anders Il video PDC di "Future of C #" di Hejlsberg .

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

Ho appena risposto a un'altra discussione qui su StackOverflow una soluzione in cui ho implementato un'API per creare e manipolare AST dal codice sorgente C #

È strano che nessuno abbia suggerito di hackerare il compilatore Mono C # esistente.

Il nostro front-end C # per DMS analizza il C # 3.0 completo compresi LINQ e produce AST. Il DMS infatti è un ecosistema per l'analisi / trasformazione del codice sorgente utilizzando AST per i linguaggi forniti front-end.

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

EDIT: 27/06/2014: gestisce C # 5.0 da un po 'di tempo.

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

ANTLR non è molto utile. LINQ non è quello che vuoi.

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

È usato in molti progetti, incluso NDepend! http://www.ndepend.com/

Si prega di consultare il progetto R # (scusate se i documenti sono in russo, ma ci sono alcuni esempi di codice). Permette manipolazioni AST sul codice C #.

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

L'SVN del progetto è qui : (URL aggiornato, grazie, derigel )

Vedi anche la lingua Nemerle . È un linguaggio .Net con un forte supporto per la metaprogrammazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top