2010-03-15 2 views
9

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

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

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

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

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

+0

Нужно ли работать с неполным кодом или кодом с ошибками (то есть код, который не компилируется с помощью обычного компилятора?) Это типично требование для парсеров в стиле IntelliSense. –

+0

Да, он должен работать над неполным кодом. Я ищу вещи на лету. – Blindy

ответ

5

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

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

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

Может быть something on CodePlex или аналогичный сайт.

ОБНОВЛЕНИЕ
См. Этот родственный пост. Parser for C#

+0

+1 для обновления тоже - он содержит работоспособные решения –

1

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

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

1

Вы пробовали использовать класс 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, но все еще может быть стоит:

Generate Code-DOMs directly from C# or VB.NET

+0

Это не реализуется ни одним из поставщиков кода и не генерирует исключение NotImplementedException. – Josh

+0

@ Джош: Кажется, вы правы. Я просто попытался, и это действительно не сработало. Такой облом. – jrista

2

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

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

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

+0

Да, я начинаю рассматривать синтаксический анализ вручную. Не уверен, насколько это будет сложно с дженериками. – Blindy

2

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

+0

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

+0

Да. Но, поскольку они многоразовые, их можно легко настроить. ANTLR может использоваться для частичного разбора. Но, конечно, самым общим вариантом является PEG, поэтому, если вы можете получить достойную реализацию PEG для .NET, и вы можете переносить существующий, скажем, ANTLR-парсер, вы получите быстрое и простое общее решение. Например, парсер Packrat из http://www.meta-alternative.net/mbase.html способен генерировать режимы подсветки синтаксиса для текстового редактора из любого общего синтаксиса и хорошо работает с неполными или недействительными вход. –

1

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

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

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

Смежные вопросы