Вопрос
Какие парсеры доступны для синтаксического анализа кода на C #?
Я ищу анализатор C #, который может быть использован на C # и предоставить мне доступ к информации о строках и файлах о каждом артефакте анализируемого кода.
Решение
Работает над исходным кодом:
- CSParser - анализатор:От C # 1.0 до 2.0 с открытым исходным кодом
- Анализатор Metaspec C #:От C # 1.0 до 3.0, коммерческий продукт (около 5000$)
- #узнай!:От C # 1.0 до 3.0, коммерческий продукт (около 900€) (ответ от Резко распознать)
- Анализатор SharpDevelop (ответьте Аксельссон)
- Заводской:От C # 1.0 до 4.0 (+ асинхронный), с открытым исходным кодом, синтаксический анализатор, используемый в SharpDevelop.Включает семантический анализ.
- Синтаксический анализатор C # и CodeDom:Полноценный анализатор C # 4.0, уже поддерживающий функцию асинхронности C # 5.0.Коммерческий продукт (от 49 до 299 долларов) (ответ от Кен Беккет)
- Microsoft Roslyn CTP:Компилятор как сервис.
Работы по сборке:
- Система.Отражение
- Общая инфраструктура компилятора Microsoft:Начиная с C # 1.0 и заканчивая 3.0, публичная лицензия Microsoft.Используемый Fxcop и Спецификация#
- Моно.Сесил:От C # 1.0 до 3.0 с открытым исходным кодом
Проблема с "синтаксическим анализом" сборки заключается в том, что у нас меньше информации о строке и файле (информация основана на файле .pdb, а Pdb содержит информацию о строках только для методов)
Я лично рекомендую Моно.Сесил и Заводской.
Другие советы
Моно (с открытым исходным кодом) включает компилятор C # (и, конечно же, синтаксический анализатор)
Если вы собираетесь скомпилировать C # v3.5 в .net assemblies:
var cp = new Microsoft.CSharp.CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx
Если вы знакомы с ANTLR, вы можете использовать Грамматика Antlr C #.
Я реализовал именно то, о чем вы просите (предварительный анализ кода C #) на Платформа OWASP O2 проект с использованием API SharpDevelop AST.
Чтобы упростить использование, я написал быстрый API, который предоставляет ряд ключевых элементов исходного кода (используя инструкции, типы, методы, свойства, поля, комментарии) и способен переписать исходный код C # на C # и в VBNET.
Вы можете увидеть этот API в действии в этом файле скрипта O2 XRule: ascx_View_SourceCode_AST.cs.o2 .
Например, вот как вы обрабатываете текст исходного кода C # и заполняете несколько древовидных представлений и текстовых полей:
public void updateView(string sourceCode)
{
var ast = new Ast_CSharp(sourceCode);
ast_TreeView.show_Ast(ast);
types_TreeView.show_List(ast.astDetails.Types, "Text");
usingDeclarations_TreeView.show_List(ast.astDetails.UsingDeclarations,"Text");
methods_TreeView.show_List(ast.astDetails.Methods,"Text");
fields_TreeView.show_List(ast.astDetails.Fields,"Text");
properties_TreeView.show_List(ast.astDetails.Properties,"Text");
comments_TreeView.show_List(ast.astDetails.Comments,"Text");
rewritenCSharpCode_SourceCodeEditor.setDocumentContents(ast.astDetails.CSharpCode, ".cs");
rewritenVBNet_SourceCodeEditor.setDocumentContents(ast.astDetails.VBNetCode, ".vb");
}
Пример на ascx_View_SourceCode_AST.cs.o2 также показано, как затем вы можете использовать информацию, собранную из AST, для выбора в исходном коде типа, метода, комментария и т.д..
Для справки вот написанный код API (обратите внимание, что это мой первый опыт использования анализатора C # AST от SharpDevelop, и я все еще пытаюсь понять, как это работает):
Недавно мы выпустили анализатор C #, который обрабатывает все функции C # 4.0, а также новую функцию async: Синтаксический анализатор C # и CodeDom
Эта библиотека генерирует семантическую объектную модель, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена.Он также поддерживает использование запросов LINQ для анализа исходного кода.
Резкое развитие, IDE с открытым исходным кодом поставляется с анализатором кода на основе посетителей, который работает действительно хорошо.Его можно использовать независимо от IDE.
Подумайте о том, чтобы использовать отражение для встроенного двоичного файла вместо непосредственного анализа кода C #.Reflection API действительно прост в использовании, и, возможно, вы сможете получить всю необходимую вам информацию?
Взгляните на Анализатор Золота.Он имеет очень интуитивно понятный IU, который позволяет вам интерактивно тестировать вашу грамматику и генерировать код на C #.С ним доступно множество примеров, и это абсолютно бесплатно.
Может быть, вы могли бы попробовать с иронией над irony.codeplex.com.
Это очень быстро, и грамматика c # уже существует.
Сама грамматика написана непосредственно на c # способом, подобным BNF (достигается с некоторыми перегрузками операторов)
Самое лучшее в этом то, что "грамматика" создает AST напрямую.
Что-то, что набирает обороты и очень подходит для этой работы, это Немерле
вы можете увидеть, как это могло бы решить проблему, в этих видеороликах от NDC :
Не на C #, но полноценный синтаксический анализатор C # 2/3/4, который создает полные ASTS, доступен с нашим Инструментарий для реинжиниринга программного обеспечения DMS.
DMS предоставляет обширную инфраструктуру для синтаксического анализа, построения дерева, построения таблиц символов и анализа потоков, преобразования от источника к источнику и регенерации исходного кода из (модифицированных) ASTS.(Он также обрабатывает многие другие языки, кроме C #.)
РЕДАКТИРОВАТЬ (сентябрь) 2013:Этот ответ в последнее время не обновлялся.DMS уже давно работает с C # 5.0
GPPG может быть полезно, если вы хотите написать свой собственный синтаксический анализатор (что очень интересно).