Парсер для С#

Какие синтаксические анализаторы доступны для синтаксического анализа кода на С#?

Я ищу парсер С#, который можно использовать в С# и дать мне доступ к информации о строках и файлах по каждому артефакту анализируемого кода.

Ответ 1

Работает с исходным кодом:

  • CSParser: С С# 1.0 до 2.0, с открытым исходным кодом
  • Metaspec С# Parser: С С# 1.0 до 3.0, коммерческий продукт (около 5000 $)
  • # распознать!: От С# 1.0 до 3.0, коммерческий продукт (около 900 €) (ответ SharpRecognize)
  • SharpDevelop Parser (ответ Akselsson)
  • NRefactory: От С# 1.0 до 4.0 (+ async), open-source, парсер, используемый в SharpDevelop. Включает семантический анализ.
  • С# Parser и CodeDOM: Полный Carser С# 4.0, уже поддерживает асинхронную функцию С# 5.0. Коммерческий продукт (49 $до 299 $) (ответ Кен Беккет)
  • Microsoft Roslyn CTP: Компилятор как услуга.

Работает на сборке:

Проблема с синтаксическим анализом сборки заключается в том, что у нас меньше информации о строке и файле (информация основана на файле .pdb, а Pdb содержит строки информации только для методов)

Я лично рекомендую Mono.Cecil и NRefactory.

Ответ 2

Mono (с открытым исходным кодом) включает компилятор С# (и, конечно же, парсер)

Ответ 5

Я реализовал именно то, что вы просите (AST Parsing of С# code) в проекте OWASP O2 Platform, используя API-интерфейс SharpDevelop AST.

Чтобы упростить использование, я написал быстрый API, который предоставляет несколько ключевых элементов исходного кода (с использованием операторов, типов, методов, свойств, полей, комментариев) и может переписать исходный код С# на С# и в VBNET.

Вы можете увидеть этот API в действии в этом файле O2 XRule script: ascx_View_SourceCode_AST.cs.o2.

Например, так вы обрабатываете текст исходного кода С# и заполняете несколько 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 также показано, как вы можете использовать информацию, собранную из АСТ, для выбора в исходном коде типа, метод, комментарий и т.д.

Для справки приведен код API, который написал (обратите внимание, что это мой первый проход при использовании анализатора SharpDevelop С# AST, и я все еще обдумываю, как это работает):

Ответ 6

Недавно мы выпустили синтаксический анализатор С#, который обрабатывает все функции С# 4.0 плюс новую функцию async: С# Parser и CodeDOM

Эта библиотека генерирует семантическую модель объекта, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена. Он также поддерживает использование запросов LINQ для анализа исходного кода.

Ответ 8

SharpDevelop, с открытым исходным кодом IDE, поставляется с парсером на основе посетителя, который работает очень хорошо. Он может использоваться независимо от IDE.

Ответ 9

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

Ответ 10

Посмотрите Gold Parser. Он имеет очень интуитивное IU, которое позволяет вам интерактивно тестировать вашу грамматику и генерировать код С#. Есть много примеров, доступных с ним, и это абсолютно бесплатно.

Ответ 11

Может быть, вы могли бы попробовать с Иронией на irony.codeplex.com.

Это очень быстро, и грамматика С# уже существует.

Сама грамматика записывается непосредственно в С# в виде BNF, как (с некоторыми перегрузками операторов)

Самое лучшее в этом состоит в том, что "грамматика" напрямую производит АСТ.

Ответ 12

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

Ответ 13

Не в С#, но полный анализатор С# 2/3/4, который строит полные АСТ, доступен с нашим DMS Software Reengineering Toolkit.

DMS предоставляет обширную инфраструктуру для синтаксического анализа, построения дерева, построения таблиц символов и анализа потоков, преобразования источника в источник и регенерации исходного кода из (модифицированных) АСТ. (Он также обрабатывает многие другие языки, кроме как только С#.)

EDIT (сентябрь) 2013: этот ответ не был обновлен в последнее время. DMS давно обрабатывает С# 5.0

Ответ 15

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