Поиск C# кодирует [закрытый] синтаксический анализатор

Я ищу ряд классов (предпочтительно в платформе .NET), который проанализирует код C# и возвратит список функций с параметрами, классов с их методами, свойства и т.д. Идеально это обеспечило бы все, что это необходимо для создания моего собственного intellisense.

У меня есть чувство, что что-то вроде этого должно быть в платформе .NET, учитывая весь отражательный материал, который они предлагают, но если не затем альтернатива с открытым исходным кодом достаточно хороша.

То, что я пытаюсь создать, является в основном чем-то как Компилятор Отрывка, но со скручиванием. Я пытаюсь выяснить, как получить код dom сначала.

Я пытался гуглить для этого, но я не уверен, что правильный термин для этого так, я подошел пустой.

Править: Так как я надеюсь использовать, это для подобной intellisense обработки, на самом деле компилируя код не будет работать, так как это, скорее всего, будет неполно. Извините я должен был упомянуть это сначала.

9
задан Jon Seigel 5 June 2010 в 11:34
поделиться

5 ответов

Хотя пространство имен .NET CodeDom предоставляет базовый API для синтаксических анализаторов языка кода , они не реализованы. Visual Studio делает это с помощью собственных языковых служб. Они недоступны в распространяемой среде.

Вы можете либо ...

  1. Скомпилировать код, а затем использовать отражение в полученной сборке
  2. Посмотрите на что-то вроде компилятора Mono C #, который создает эти синтаксические деревья. Это не будет высокоуровневый API, такой как CodeDom, но, возможно, вы сможете с ним работать.

Может быть что-то есть на CodePlex или на подобном сайте.

ОБНОВЛЕНИЕ
См. Этот связанный пост. Синтаксический анализатор для C #

5
ответ дан 3 November 2019 в 00:00
поделиться

Пробовали ли вы использовать класс Microsoft.CSharp.CSharpCodeProvider ? Это полный поставщик кода C #, поддерживающий CodeDom. Вам просто нужно вызвать .Parse () в текстовом потоке, и вы получите обратно CodeCompileUnit.

var codeStream = new StringReader(code);
var codeProvider = new CSharpCodeProvider();

var compileUnit = codeProvider.Parse(codeStream);

// compileUnit contains your code dom

Что ж, поскольку вышеперечисленное не работает (я только что протестировал), следующая статья может быть интересна. Я давно добавил его в закладки, поэтому считаю, что он поддерживает только C # 2.0, но, возможно, оно того стоит:

Создание кодовых DOM непосредственно из C # или VB.NET

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

Посмотрите на CSharpCodeCompiler в пространстве имен Microsoft.CSharp. Вы можете компилировать с помощью CSharpCodeCompiler и получить доступ к результирующей сборке с помощью CompilerResults.CompiledAssembly. Из этой сборки вы сможете получить типы, а из типов вы сможете получить всю информацию о свойствах и методах, используя отражение.

Производительность будет довольно средней, так как вам придется компилировать весь исходный код каждый раз, когда что-то изменится. Я не знаю никаких методов, которые позволят вам инкрементально компилировать фрагменты кода.

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

Если вам нужно, чтобы он работал с неполным кодом или кодом с ошибками, то я считаю, что вы в значительной степени сами по себе (то есть вы не сможете использовать CSharpCodeCompiler класс или что-нибудь в этом роде).

Есть такие инструменты, как ReSharper, который выполняет собственный синтаксический анализ, но это предварительный вариант. Возможно, вы сможете начать с компилятора Mono, но, по моему опыту, написание парсера, работающего с неполным кодом, - это совершенно другая игра по сравнению с написанием того, который просто должен выдавать ошибки в неполном коде.

Если вам нужны просто имена классов и методов (в основном метаданные), вы можете выполнить синтаксический анализ «вручную», но я думаю, это зависит от того, насколько точны вам нужны результаты.

2
ответ дан 3 November 2019 в 00:00
поделиться

Компилятор GMCS проекта Mono содержит довольно многоразовый парсер для C#4.0. И относительно легко написать свой собственный парсер, который будет удовлетворить ваши конкретные потребности. Например, вы можете повторно использовать это: http://antlrcsharp.codeplex.com/

2
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

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