Перевести код C # на AST? - PullRequest
       48

Перевести код C # на AST?

15 голосов
/ 17 октября 2008

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

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

Ответы [ 12 ]

17 голосов
/ 27 октября 2011

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

SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
    @" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
12 голосов
/ 17 октября 2008

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

Да, тривиально в особых обстоятельствах (= с использованием новой платформы выражений ):

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

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

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: 1014 *.

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

6 голосов
/ 17 октября 2008

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

Предполагается также поддержка в #develop для генерации дерева CodeDom из исходного кода C # в соответствии с этой публикацией .

4 голосов
/ 08 марта 2011

Существует гораздо более мощный, чем проект 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/

3 голосов
/ 07 мая 2012

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

2 голосов
/ 26 ноября 2008

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

2 голосов
/ 18 ноября 2008

Похоже, что такая функциональность будет включена во все, что будет после C # 4, согласно видео PDC Андерса Хейлсберга «Будущее C #» .

1 голос
/ 08 марта 2011

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

1 голос
/ 07 февраля 2010

Я только что ответил в другом потоке здесь, в StackOverflow, решение, в котором я реализовал API для создания и управления AST из исходного кода C #

1 голос
/ 04 октября 2009

ANTLR не очень полезен. LINQ - это не то, чего ты хочешь.

Попробуйте Mono.Cecil! http://www.mono -project.com / Cecil

Используется во многих проектах, включая NDepend! http://www.ndepend.com/

...