Вопрос

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

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

Это было полезно?

Решение

Roslyn находится в Visual Studio 2010 и предоставляет вам программный доступ к < среди прочего, href = "http://msdn.microsoft.com/en-us/hh543916" rel = "noreferrer"> Дерево синтаксиса .

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

Другие советы

  

Возможно ли в настоящее время перевести код 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.

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

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

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

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

https://code.google .com / р / Nemerle / источник / просмотр / Nemerle / багажник / сниппеты / колышек-анализатор /

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ 3/10/2010: ... Теперь обрабатывает полную версию C # 4.0

РЕДАКТИРОВАНИЕ: 27.06.2014: Обрабатывает C # 5.0 довольно давно.

РЕДАКТИРОВАТЬ: 15.06.2016: ручки C # 6.0. См. https://stackoverflow.com/a/37847714/120163 для примера AST.

ANTLR не очень полезен. LINQ не то, что вы хотите.

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

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

Пожалуйста, посмотрите проект R # (извините, документы на русском языке, но есть несколько примеров кода). Это позволяет манипулировать AST на коде C #.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top