Парсер для C#
Какие парсеры доступны для анализа кода C#?
Я ищу синтаксический анализатор C#, который можно использовать в C# и дать мне доступ к информации о строках и файлах каждого артефакта анализируемого кода.
15 ответов
Работает над исходным кодом:
- CSParser: от C# 1.0 до 2.0, с открытым исходным кодом
- Metaspec C# Parser: от C# 1.0 до 3.0, коммерческий продукт (около 5000 $)
- #recognize!: От C# 1.0 до 3.0, коммерческий продукт (около 900€) (ответ от SharpRecognize)
- SharpDevelop Parser (ответ Аксельссона)
- NRefactory: от C# 1.0 до 4.0 (+ асинхронный), с открытым исходным кодом, парсер, используемый в SharpDevelop. Включает в себя семантический анализ.
- C# Parser и CodeDOM: полный C# 4.0 Parser, уже поддерживающий асинхронную функцию C# 5.0. Коммерческий продукт (от 49$ до 299$) (ответ Кена Беккета)
- Microsoft Roslyn CTP: компилятор как сервис.
Работы по сборке:
- System.Reflection
- Общая инфраструктура компилятора Microsoft: от C# 1.0 до 3.0, публичная лицензия Microsoft. Используется Fxcop и SpeC#
- Mono.Cecil: от C# 1.0 до 3.0, с открытым исходным кодом
Проблема с "разбором" сборки в том, что у нас меньше информации о строке и файле (информация основана на файле.pdb, а Pdb содержит информацию о строках только для методов)
Я лично рекомендую Mono.Cecil и NRefactory.
Mono (с открытым исходным кодом) включает в себя компилятор C# (и, конечно, парсер)
Если вы собираетесь скомпилировать C# v3.5 в сборки.net:
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#.
Я реализовал именно то, что вы просите (синтаксический анализ AST кода C#) в проекте OWASP O2 Platform, используя API-интерфейсы SharpDevelop AST.
Чтобы упростить его использование, я написал быстрый API, который предоставляет ряд ключевых элементов исходного кода (используя операторы, типы, методы, свойства, поля, комментарии) и может переписать исходный код C# в C# и в VBNET.,
Вы можете увидеть этот API в действии в этом файле сценария O2 XRule: ascx_View_SourceCode_AST.cs.o2.
Например, вот как вы обрабатываете текст исходного кода C# и заполняете несколько TreeViews и TextBoxes:
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, а также новую асинхронную функцию: C# Parser и CodeDOM
Эта библиотека генерирует семантическую объектную модель, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена. Он также поддерживает использование запросов LINQ для анализа исходного кода.
Посмотрите на Gold Parser. Он имеет очень интуитивно понятный IU, который позволяет вам в интерактивном режиме проверить свою грамматику и сгенерировать код C#. Есть много примеров, доступных с этим, и это абсолютно бесплатно.
Может быть, вы могли бы попробовать с Иронией на Irony.codeplex.com.
Это очень быстро и AC# грамматика уже существует.
Сама грамматика написана непосредственно на C# в BNF-стиле (достигается некоторыми перегрузками операторов)
Лучшая вещь с этим - то, что "грамматика" производит AST непосредственно.
SharpDevelop, IDE с открытым исходным кодом, поставляется с анализатором кода на основе посетителей, который работает очень хорошо. Может использоваться независимо от IDE.
Подумайте о том, чтобы использовать отражение для встроенного двоичного файла вместо непосредственного анализа кода C#. API отражения действительно прост в использовании и, возможно, вы можете получить всю необходимую информацию?
Не в C#, а с полным набором синтаксических анализаторов C# 2/3/4, который создает полные AST, доступен с нашим DMS Software Reengineering Toolkit.
DMS предоставляет обширную инфраструктуру для анализа, построения дерева, построения таблиц символов и анализа потоков, преобразования источника в источник и восстановления исходного кода из (модифицированных) AST. (Он также обрабатывает многие другие языки, кроме C#.)
РЕДАКТИРОВАТЬ (сентябрь) 2013: Этот ответ не был обновлен в последнее время. DMS долго занимался C# 5.0
Nemerle набирает обороты и очень подходит для работы
Вы можете увидеть, как это могло бы решить это в этих видео от NDC: