Поиск парсера кода C #

Я ищу набор classов (желательно в рамках .net), которые будут анализировать код C # и возвращать список функций с параметрами, classами с их методами, свойствами и т. Д. В идеале это обеспечит все, что необходимо для создания собственных IntelliSense.

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

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

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

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

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

Вы могли бы …

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

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

ОБНОВИТЬ
См. Этот связанный пост. Парсер для C #

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

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

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

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

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

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

Пробовали ли вы использовать class Microsoft.CSharp.CSharpCodeProvider ? Это полный поставщик кода C #, который поддерживает CodeDom. Вам просто нужно вызвать .Parse () в текстовом streamе, и вы получите код 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

Возможно, для Blindy может быть немного поздно, но я недавно выпустил синтаксический анализатор C #, который был бы идеальным для такого рода вещей, поскольку он предназначен для обработки fragmentов кода и сохраняет комментарии: C # Parser и CodeDOM

Он обрабатывает C # 4.0, а также новую функцию async. Это коммерческая, но небольшая часть стоимости других коммерческих компиляторов.

Я действительно думаю, что немногие люди понимают, насколько сложный синтаксический анализ C # стал, особенно если вам нужно правильно разрешить символические ссылки (что обычно требуется, если, возможно, вы просто делаете форматирование). Просто попробуйте прочитать и полностью понять раздел «Тип ввода» в спецификации языка 500+. Затем размышляйте о том, что спецификация на самом деле не является полностью правильной (как упоминал сам Эрик Липперт).