Перевести код C # на AST?
-
03-07-2019 - |
Вопрос
Возможно ли в настоящее время перевести код 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 # в абстрактное синтаксическое дерево?
Проверьте .NET поддержку CodeDom . Существует старая статья о проекте кода для синтаксического анализатора C # CodeDOM , но она выиграла не поддерживает новые языковые функции.
Предполагается также поддержка в #develop для создания дерева CodeDom из исходного кода C # в соответствии с этим публикация .
Существует гораздо более мощный, чем проект R #. Nemerle.Peg:
И у него есть C # Parser, который анализирует весь код C # и переводит его в AST!
Вы можете загрузить установщик здесь: 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 с сильной поддержкой метапрограммирования.