Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Что-то, что набирает обороты и очень подходит для этой работы, это Немерле

вы можете увидеть, как это могло бы решить проблему, в этих видеороликах от NDC :

Не на C #, но полноценный синтаксический анализатор C # 2/3/4, который создает полные ASTS, доступен с нашим Инструментарий для реинжиниринга программного обеспечения DMS.

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

РЕДАКТИРОВАТЬ (сентябрь) 2013:Этот ответ в последнее время не обновлялся.DMS уже давно работает с C # 5.0

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top