Перевести код С# в AST?

Можно ли в настоящее время перевести код С# в абстрактное дерево синтаксиса?

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

Ответы

Ответ 1

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

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

Ответ 2

Можно ли в настоящее время перевести код С# в абстрактное дерево синтаксиса?

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

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

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

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.

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

Ответ 3

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

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

Ответ 4

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

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

И у него есть С# Parser, который анализирует весь код С# и переводит его в AST!

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

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

Ответ 5

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

Ответ 7

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

Ответ 8

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

ИЗМЕНИТЬ 3/10/2010:... Теперь обрабатывает полный С# 4.0

EDIT: 6/27/2014: Ручки С# 5.0 с довольно долгого времени.

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

Ответ 11

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

Ответ 12

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

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

Проект SVN здесь: (URL обновлен, спасибо, derigel)

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