Парсер для 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: компилятор как сервис.

Работы по сборке:

Проблема с "разбором" сборки в том, что у нас меньше информации о строке и файле (информация основана на файле.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, и я все еще размышляю над тем, как он работает):

Вы обязательно должны проверить Roslyn, поскольку MS только что открыла (или скоро откроет) код с лицензией Apache 2 здесь. Вы также можете проверить способ анализа этой информации с помощью этого кода из GitHub.

Недавно мы выпустили синтаксический анализатор 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:

GPPG может быть полезен, если вы хотите написать свой собственный парсер (что интересно).

Другие вопросы по тегам