Ответ 1
Проект Roslyn находится в Visual Studio 2010 и дает вам программный доступ к Дерево синтаксиса, между прочим.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
Можно ли в настоящее время перевести код С# в абстрактное дерево синтаксиса?
Изменить: некоторые разъяснения; Я не обязательно ожидаю, что компилятор будет генерировать AST для меня - парсер будет хорошо, хотя я бы хотел использовать что-то "официальное". Лямбда-выражения, к сожалению, не будут достаточными, если они не позволят мне использовать тела высказываний, и это то, что я ищу.
Проект Roslyn находится в Visual Studio 2010 и дает вам программный доступ к Дерево синтаксиса, между прочим.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
Можно ли в настоящее время перевести код С# в абстрактное дерево синтаксиса?
Да, тривиально в особых обстоятельствах (= использование новой Структура выражений):
// 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.
Откажитесь от поддержки .NET CodeDom. Существует старая статья о проекте кода для С# CodeDOM parser, но она не будет поддерживать новые языковые функции.
Предполагается также поддержка в #develop для генерации дерева CodeDom из исходного кода С# в соответствии с этой публикацией.
Существует много возможностей, чем проект 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/
Лично я бы использовал NRefactory, который является бесплатным, с открытым исходным кодом и получает популярность.
Похоже, что такая функциональность будет включена в то, что приходит после С# 4, согласно Андерс Хейлсберг "Будущее С#" PDC video.
ANTLR Parser Generator имеет грамматику для С# 3.0, которая охватывает все, кроме синтаксиса LINQ.
Наш С# 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 для образца АСТ.
ANTLR не очень полезен. LINQ не то, что вы хотите.
Попробуйте Mono.Cecil! http://www.mono-project.com/Cecil
Он используется во многих проектах, включая NDepend! http://www.ndepend.com/
Я только что ответил на другой поток здесь, в StackOverflow, где я реализовал API для создания и управления AST из исходного кода С#
Странно, что никто не предлагал взломать существующий компилятор Mono С#.
Пожалуйста, смотрите проект R # (извините, что документы написаны на русском языке, но есть примеры кода). Он позволяет выполнять операции АСТ на коде С#.
http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml
Проект SVN здесь: (URL обновлен, спасибо, derigel)
Также см. Nemerle. Это язык .Net с сильной поддержкой метапрограммирования.