2008-10-17 3 views
15

В настоящее время можно перевести код C# в абстрактное дерево синтаксиса?Перевести код C# в AST?

Редактировать: некоторые разъяснения; Я не обязательно ожидаю, что компилятор будет генерировать AST для меня - парсер будет хорошо, хотя я бы хотел использовать что-то «официальное». Лямбда-выражения, к сожалению, не будут достаточными, если они не позволят мне использовать тела высказываний, и это то, что я ищу.

+0

Интересно, как ур пытается перевести код C# на АСТ? – yeeen

+0

Я отложил проект. –

+4

Долгосрочная удержание ... Lol –

ответ

17

Проект Roslyn находится в Visual Studio 2010 и дает вам программный доступ к Syntax Tree, между прочим.

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

Я собирался опубликовать это как ответ на свой вопрос, но вы избили меня до него. знак равно –

6

Check. NET CodeDom поддержка. Существует старая статья о проекте кода для C# CodeDOM parser, но она не будет поддерживать новые функции языка.

Существует также поддержка в #develop для генерации дерева CodeDom из исходного кода C# в соответствии с этим posting.

0

См. Проект R # (извините, что документы написаны на русском языке, но есть примеры кода). Это позволяет использовать методы АСТ в коде C#. SVN

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

проекта является here: (URL обновляется, спасибо, derigel)

Также смотрите на Nemerle язык. Это язык .Net с сильной поддержкой метапрограммирования.

+0

Репозиторий теперь находится по адресу http://svn.rsdn.ru/svn/RSharp/ – derigel

12

В настоящее время можно перевести код C# в абстрактное дерево синтаксиса?

Да, тривиальным в особых условиях (= с помощью нового Expressions framework):

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

Это создает дерево выражения для лямбда, то есть функция, принимающая в int и возвращающегося двойной. Вы можете изменить дерево выражений, используя структуру выражений (= классы из в этом пространстве имен), а затем скомпилировать его во время выполнения:

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 

Обратите внимание, что все выражения неизменны, поэтому они должны быть построены заново состав. В этом случае я добавил добавление 1.

Обратите внимание, что эти деревья выражений работают только на реальные выражения, т. Е. Содержимое, найденное в функции C#. Вы не можете получить деревья синтаксиса для более высоких конструкций, таких как классы таким образом. Используйте для этого схему CodeDom.

+0

Эрик принял это? Он использует самые лямбда-формы, которые, по его словам, он не хотел. –

+1

Ира: вы должны обратить внимание на развитие дискуссии. Запись опубликована * до * Редактирование/разъяснение Эрика. По-видимому, ни один из других ответов не был лучшим * в то время * (обратите внимание: * год назад! *), Поэтому он не принял другого ответа. Вероятно, ваш ответ, что он хотел. –

2

Похоже, что этот вид функциональности будет включен в состав всех, что приходит после C# 4, согласно Anders Hejlsberg's 'Future of C#' PDC video.

+0

Это полезно, чтобы увидеть, что C# не предлагает библиотеку для управления C# API. Это из-за того, что это компилятор классический, черный ящик! – yeeen

2

ANTLR Parser Generator имеет грамматику для C# 3.0, которая охватывает все, кроме синтаксиса LINQ.

+0

Я использовал ANTLR в прошлом, и это довольно хорошо. Я не использовал грамматику C#, но большинство участников там довольно убедительно. – Travis

1

Наш C# front end for DMS анализирует полный C# 3.0, включая LINQ, и производит АСТ. Фактически DMS представляет собой экосистему для анализа/преобразования исходного кода с использованием АСТ для интерфейсных логарифмов.

EDIT 3/10/2010: ... Теперь ручки полный C# 4.0

EDIT: 6/27/2014: Ручки C# 5.0, так как довольно долго.

EDIT: 15.06.2016: Ручки C# 6.0. См. https://stackoverflow.com/a/37847714/120163 для образца АСТ.

+0

2004? Я предполагаю, 2010 год. – Cheeso

+0

@ Чисо: Хм, 2004 год означал бы, что мы зачерпнули MS. Ну, это никогда не делает, чтобы предположить, что, поэтому я изменил его сказать 2010. Исправлено. –

4

Существует много мощный, чем R # проекта. Nemerle.Peg:

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

И есть C# Parser, который парсеры все C# код и переводит его в AST!

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

Вы можете скачать инсталлятор здесь: https://code.google.com/p/nemerle/

+0

Кроме того. Nemerle может скомпилировать источники C# с использованием компилятора Nemerle! :) –

1

Странно, что никто не предложил хакерство существующий Mono C# компилятор.

3

Лично я хотел бы использовать NRefactory, который является свободным, открытым исходным кодом и набирает популярность.

Смежные вопросы