2008-10-17 30 views
15

Czy obecnie możliwe jest przetłumaczenie kodu C# na drzewo składni abstrakcyjnej?Przetłumaczyć kod C# na AST?

Edytuj: niektóre wyjaśnienia; Niekoniecznie oczekuję, że kompilator wygeneruje dla mnie AST - parser będzie w porządku, chociaż chciałbym użyć czegoś "oficjalnego". Wyrażenia lambdy nie będą niestety wystarczające, ponieważ nie pozwalają mi na użycie ciał zdań, czego właśnie szukam.

+0

Zastanawiasz się, w jaki sposób próbuje się przetłumaczyć kod C# na AST? – yeeen

+0

Zawieszam projekt. –

+4

Długoterminowe przytrzymaj ... Lol –

Odpowiedz

17

Projekt Roslyn jest w Visual Studio 2010 i daje programowy dostęp do Syntax Tree, między innymi.

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

Zamierzałem opublikować to jako odpowiedź na moje własne pytanie, ale mnie do tego przekonałeś. =) –

6

Sprawdź obsługę .NET CodeDom. Istnieje stary artykuł na temat projektu kodu dla C# CodeDOM parser, ale nie będzie on obsługiwał nowych funkcji językowych.

Należy również obsługiwać w #develop do generowania drzewa CodeDom z kodu źródłowego C# zgodnie z tym posting.

0

Proszę zobaczyć projekt R # (przepraszam, że dokumenty są w języku rosyjskim, ale jest kilka przykładów kodu). Pozwala to na manipulacje AST przy użyciu kodu C#. SVN

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

projektu jest here: (URL aktualizowane, dzięki derigel)

Także proszę zobaczyć języka Nemerle. Jest to język .Net z silnym wsparciem dla metaprogramowania.

+0

Repozytorium znajduje się teraz pod adresem http://svn.rsdn.ru/svn/RSharp/ – derigel

12

Czy jest obecnie możliwe przetłumaczenie kodu C# na drzewo składni abstrakcyjnej?

Tak, trywialnie w szczególnych okolicznościach (= stosując nowy Expressions framework):

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

Stwarza to drzewa wyrażenie dla lambda, to znaczy funkcja bierze się int i powracający podwójne. Można zmodyfikować drzewa wyrażenie za pomocą ramy wyrażenia (= klas od w tej przestrzeni nazw), a następnie skompilować go w czasie wykonywania:

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 

Zauważ, że wszystkie wyrażenia są niezmienne więc muszą być budowane na nowo kompozycja. W tym przypadku dodałem 1.

Zauważ, że te drzewa wyrażeń działają tylko w przypadku wyrażeń rzeczywistych, czyli treści znalezionych w funkcji C#. Nie można uzyskać drzewek składni wyższych konstrukcji, takich jak klasy w ten sposób. Użyj do tego struktury CodeDom.

+0

Erik to zaakceptował? Używa bardzo form lambda, o których powiedział, że nie chce. –

+1

Ira: powinieneś zwrócić uwagę na rozwój dyskusji. Ten wpis został opublikowany * przed * edycją/wyjaśnieniem Erika. Najwyraźniej żadna z pozostałych odpowiedzi nie była lepsza * w tym czasie * (uwaga: * rok temu! *), Więc nie przyjął innej odpowiedzi. Twoja odpowiedź jest prawdopodobnie tym, czego by chciał. –

2

Wygląda na to, że tego rodzaju funkcjonalność będzie dołączona do wszystkiego, co pojawi się po C# 4, zgodnie z Anders Hejlsberg's 'Future of C#' PDC video.

+0

To jest pomocne, aby zobaczyć, co C# nie oferuje biblioteki do manipulowania C# API. Dzieje się tak dlatego, że jego kompilator jest klasycznym, czarnym pudełkiem! – yeeen

2

Gramatura dla języka C# 3.0, która obejmuje wszystko oprócz składni LINQ.

+0

Użyłem ANTLR w przeszłości i jest całkiem niezły. Nie użyłem gramatyki C#, ale większość autorów jest dość podstępna. – Travis

1

Nasz C# front end for DMS parsuje pełne C# 3.0, w tym LINQ i produkuje AST. DMS w rzeczywistości jest ekosystemem do analizy/transformacji kodu źródłowego przy użyciu AST dla dostarczanych interfejsów front-end.

EDIT 10.03.2010: ... Teraz obsługuje pełny C# 4.0

EDIT: 27.06.2014: Uchwyty C# 5.0 od dość chwilę.

EDYCJA: 6/15/2016: Obsługuje C# 6.0. Zobacz https://stackoverflow.com/a/37847714/120163 dla próbki AST.

+0

2004? Zgaduję 2010. – Cheeso

+0

@Cheeso: Hmm, 2004 oznaczałoby, że zgarnęliśmy stwardnienie rozsiane. Cóż, nigdy tego nie sugeruje, więc zmodyfikowałem go w 2010 roku. Naprawiono. –

1

To dziwne, że nikt nie zaproponował hacking istniejącą Mono C# kompilator.

3

Osobiście używam NRefactory, który jest darmowy, open source i zyskuje popularność.