Frage

Ist es derzeit möglich, C # -Code in eine Abstract Syntax Tree?

zu übersetzen

Edit: eine Klarstellung; Ich erwarte nicht unbedingt der Compiler den AST für mich zu generieren - „offiziellen“ ein Parser wäre in Ordnung, obwohl ich mag etwas verwenden, Lambda-Ausdrücke werden leider nicht ausreichend sein, gegeben sie nicht zulassen, dass mir Aussage Körper zu verwenden, das ist, was ich suche.

War es hilfreich?

Lösung

Die Roslyn Projekt ist in Visual Studio 2010 und erhalten Sie programmatischen Zugriff auf die < a href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Syntaxbaum , unter anderem.

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

Andere Tipps

  

Ist es derzeit möglich, C # -Code in eine Abstract Syntax Tree?

zu übersetzen

Ja, trivialerweise unter besonderen Umständen (= den neuen Expressions Rahmen ):

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

Dies erzeugt einen Ausdrucksbaum für das Lambda, das heißt eine Funktion eine int nehmen und die doppelte Rückkehr. Sie können unter Verwendung des Expressions Rahmen (= die Klassen aus in diesem Namespace), um den Ausdrucksbaum ändern und kompilieren Sie es dann zur Laufzeit:

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

Beachten Sie, dass alle Ausdrücke unveränderlich sind, so dass sie erneut durch die Zusammensetzung gebaut werden müssen. In diesem Fall habe ich einen Zusatz von 1 vorangestellt.

Beachten Sie, dass diese Ausdrucksbäume funktionieren nur auf reale Ausdrücke heißen Inhalte in einer C # Funktion gefunden. Sie können keine Syntaxbäume für höhere Konstrukte wie Klassen auf diese Weise erhalten. Verwenden Sie den CodeDom Rahmen für diese.

Überprüfen Sie heraus .NET CodeDom Unterstützung. Es gibt einen alten Artikel über Code-Projekt für ein C # CodeDOM Parser , aber es gewann ‚t die neuen Sprachfunktionen unterstützen.

Es wird auch einen CodeDom Baum zur Erzeugung von C # Quellcode nach diesem Entsendung .

Es ist viel mächtiger als R # Projekt. Nemerle.Peg:

https://code.google .com / p / Nemerle / source / browse / Nemerle / trunk / snippets / peg-Parser /

Und es hat # Parser C, die alle-Parser C # -Code und übersetzt sie in AST!

https://code.google .com / p / Nemerle / source / browse / Nemerle / trunk / snippets / csharp-Parser /

Sie können Installer herunterladen: https://code.google.com/p/nemerle/

Persönlich würde ich benutzen NRefactory , die kostenlose Open-Source und Popularität gewinnt ist.

Es sieht aus wie diese Art von Funktionalität wird mit einbezogen werden, was kommt nach C # 4, nach Anders Hejlsberg die 'Zukunft von C #' PDC Video .

Der ANTLR Parser Generator eine Grammatik für C # 3.0 hat, die alles außer für LINQ-Syntax abdeckt.

Ich habe gerade auf einem anderen Thread hier bei Stackoverflow eine Lösung beantwortet, wo ich eine API an erstellen und bearbeiten von AST von C # Source Code

Es ist merkwürdig, dass niemand vorgeschlagen, die bestehenden Mono C # Compiler Hacking.

C # Front für DMS Ende parst volle C # 3.0 einschließlich LINQ und produziert Ast. DMS in der Tat ist ein Ökosystem für die Analyse / Quellcode Transformation Äste für Front-End vorgesehen langauges verwendet wird.

EDIT 2010.03.10: ... Jetzt Griffe voll C # 4.0

EDIT: 2014.06.27. Griffe C # 5.0, da schon eine ganze Weile

EDIT: 2016.06.15: Griffe C # 6.0. Siehe https://stackoverflow.com/a/37847714/120163 für eine Probe AST.

ANTLR ist nicht sehr nützlich. LINQ ist nicht das, was Sie wollen.

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

Es wird in vielen Projekten, einschließlich NDepend! http://www.ndepend.com/

Bitte beachten Sie die R # -Projekt (sorry die Dokumentation in russischer Sprache ist, aber es gibt einige Code-Beispiele). Es ermöglicht AST Manipulationen an C # -Code.

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

Projekt SVN ist hier : (URL aktualisiert, danke, derigel )

Auch finden Sie in der Nemerle Sprache. Es ist eine .NET-Sprache mit starken Unterstützung für metaprogramming.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top