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

Взгляните на nest.js . Это фреймворк node.js с базовым экземпляром Express и предлагает очень четкую структуру, очень похожую на приложение Angular, отличные инструменты тестирования, ... Поддерживаются различные протоколы обмена сообщениями ( rabbitmq , [113 ] nats , mqtt , redis , ...). (Почему java является обязательным требованием? Pub / Sub должен быть независимым от языка?!)

Рассматривали ли вы использование ngrx/entity для обработки ваших обновлений данных? Я думаю, что трудно сделать общее предложение здесь, но только отправка обновлений кажется хорошей идеей. Таким образом, вы можете использовать запомненные селекторы и избежать ненужных вычислений и визуализации.

15
задан Erik Forbes 17 October 2008 в 20:38
поделиться

8 ответов

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

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

6
ответ дан 1 December 2019 в 00:18
поделиться

Похоже, что этот вид функциональности будет включен с тем, что прибывает после C# 4, согласно 'будущее Anders Hejlsberg C#' видео PDC .

2
ответ дан 1 December 2019 в 00:18
поделиться

Парсер-генератор ANTLR имеет грамматику для C# 3.0, который покрывает все за исключением синтаксиса LINQ.

2
ответ дан 1 December 2019 в 00:18
поделиться

это в настоящее время возможный перевести код C# в Абстрактное синтаксическое дерево?

Да, тривиально при особых обстоятельствах (= использование нового платформа Выражений ):

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

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

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 для них.

12
ответ дан 1 December 2019 в 00:18
поделиться

См. проект R# (извините, документы находятся на русском языке, но существуют некоторые примеры кода). Это позволяет манипуляции AST на коде C#.

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

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

Также посмотрите язык Nemerle . Это - язык .NET с мощной поддержкой метапрограммирования.

0
ответ дан 1 December 2019 в 00:18
поделиться

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

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

РЕДАКТИРОВАТЬ: 27.06.2014: Обрабатывает C # 5.0 с некоторого времени.

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

1
ответ дан 1 December 2019 в 00:18
поделиться

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

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

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

1
ответ дан 1 December 2019 в 00:18
поделиться

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

1
ответ дан 1 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: