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

Можно ли в настоящее время преобразовать 9X_c#.net код C# в абстрактное синтаксическое дерево?

Изменить: некоторые 9X_c# пояснения; Я не обязательно ожидаю, что 9X_c#.net компилятор сгенерирует для меня AST - синтаксический 9X_c# анализатор подойдет, хотя я бы хотел использовать 9X_compiler-design что-то «официальное». К сожалению, лямбда-выражений 9X_compilers недостаточно, поскольку они не позволяют 9X_ast мне использовать тела операторов, что я 9X_.cs-file и ищу.

17
0
10
Общее количество ответов: 10

Ответ #1

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

Проект Roslyn находится в Visual Studio 2010 и, помимо 9X_c-sharp прочего, предоставляет программный доступ 9X_visual-c# к Syntax Tree.

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

20
0

Ответ #2

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

Можно ли в настоящее время преобразовать 9X_abstract-syntax-tree код C# в абстрактное синтаксическое дерево?

Да, банально 9X_visual-c# в особых обстоятельствах (= при использовании 9X_abstract-syntax-tree нового Expressions framework):

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

Это создает дерево выражения для 9X_ast лямбда-выражения, то есть функцию, принимающую 9X_ast int и возвращающую двойное значение. Вы можете 9X_c-sharp изменить дерево выражений, используя платформу 9X_compiler-construction Expressions (= классы из этого пространства 9X_compiler-design имен), а затем скомпилировать его во время 9X_.cs-file выполнения:

var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11

Обратите внимание, что все выражения 9X_ast неизменяемы, поэтому их нужно строить заново 9X_c#.net путем композиции. В данном случае я добавил 9X_csharp 1.

Обратите внимание, что эти деревья выражений 9X_compiler работают только с реальными выражениями, то 9X_visual-c# есть с контентом, найденным в функции C#. Таким 9X_c-sharp образом вы не можете получить синтаксические 9X_ast деревья для более высоких конструкций, таких 9X_abstract-syntax-tree как классы. Для этого используйте платформу 9X_csharp CodeDom.

12
1

  • Ира: вам стоит обратить внимание на развитие дискуссии. Эта запись была размещена * до * редактирования / уточнения * Эрика. По-видимому, ни один из других о ...

Ответ #3

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

Ознакомьтесь с поддержкой .NET CodeDom. Есть старая 9X_compiler-construction статья о проекте кода для C# CodeDOM parser, но она не поддерживает 9X_abstract-syntax-tree новые языковые функции.

Также предполагается 9X_c-sharp поддержка в #develop создания дерева CodeDom 9X_c-sharp из исходного кода C# в соответствии с этим 9X_c#-language posting.

6
0

Ответ #4

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

Есть намного более мощный проект, чем проект 9X_c#.net R #. Nemerle.Peg:

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

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

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

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

4
0

Ответ #5

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

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

3
0

Ответ #6

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

Похоже, что такая функциональность будет 9X_compilers включена во все, что идет после C# 4, согласно 9X_compiler-construction Anders Hejlsberg's 'Future of C#' PDC video.

2
0

Ответ #7

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

ANTLR Parser Generator содержит грамматику для C# 3.0, которая 9X_c#-language охватывает все, кроме синтаксиса LINQ.

2
0

Ответ #8

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

ANTLR не очень полезен. LINQ - это не то, что 9X_c#.net вам нужно.

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

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

2
0

Ответ #9

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

Наш C# front end for DMS полностью анализирует C# 3.0, включая 9X_.cs-file LINQ, и создает AST. Фактически DMS представляет 9X_c# собой экосистему для анализа / преобразования 9X_.cs-file исходного кода с использованием AST для 9X_visual-c# языков, предоставляемых интерфейсной частью.

РЕДАКТИРОВАТЬ 9X_visual-c# 10.03.2010: ... Теперь обрабатывает полную 9X_abstract-syntax-tree версию C# 4.0

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

РЕДАКТИРОВАНИЕ: 15.06.2016: обрабатывает 9X_compiler C# 6.0. См. https://stackoverflow.com/a/37847714/120163 для образца AST.

1
0

Ответ #10

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

Я только что ответил в другом потоке здесь, в 9X_c# StackOverflow, о решении, в котором я реализовал 9X_compiler API для create and manipulate AST from C# Source Code

1
0