Какие синтаксические анализаторы доступны для синтаксического анализа кода на С#?
Я ищу парсер С#, который можно использовать в С# и дать мне доступ к информации о строках и файлах по каждому артефакту анализируемого кода.
Какие синтаксические анализаторы доступны для синтаксического анализа кода на С#?
Я ищу парсер С#, который можно использовать в С# и дать мне доступ к информации о строках и файлах по каждому артефакту анализируемого кода.
Работает с исходным кодом:
Работает на сборке:
Проблема с синтаксическим анализом сборки заключается в том, что у нас меньше информации о строке и файле (информация основана на файле .pdb, а Pdb содержит строки информации только для методов)
Я лично рекомендую Mono.Cecil и NRefactory.
Mono (с открытым исходным кодом) включает компилятор С# (и, конечно же, парсер)
Если вы собираетесь скомпилировать сборки С# 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 С#.
Я реализовал именно то, что вы просите (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, и я все еще обдумываю, как это работает):
Недавно мы выпустили синтаксический анализатор С#, который обрабатывает все функции С# 4.0 плюс новую функцию async: С# Parser и CodeDOM
Эта библиотека генерирует семантическую модель объекта, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена. Он также поддерживает использование запросов LINQ для анализа исходного кода.
SharpDevelop, с открытым исходным кодом IDE, поставляется с парсером на основе посетителя, который работает очень хорошо. Он может использоваться независимо от IDE.
Считайте использование отражения встроенным двоичным кодом вместо того, чтобы непосредственно разбирать код С#. API отражения действительно прост в использовании и, возможно, вы можете получить всю необходимую информацию?
Посмотрите Gold Parser. Он имеет очень интуитивное IU, которое позволяет вам интерактивно тестировать вашу грамматику и генерировать код С#. Есть много примеров, доступных с ним, и это абсолютно бесплатно.
Может быть, вы могли бы попробовать с Иронией на irony.codeplex.com.
Это очень быстро, и грамматика С# уже существует.
Сама грамматика записывается непосредственно в С# в виде BNF, как (с некоторыми перегрузками операторов)
Самое лучшее в этом состоит в том, что "грамматика" напрямую производит АСТ.
Вы обязательно должны проверить Roslyn, так как MS только что открыла (или скоро откроет) код с лицензией Apache 2 здесь. Вы также можете проверить способ анализа этой информации с помощью этого кода GitHub.
Не в С#, но полный анализатор С# 2/3/4, который строит полные АСТ, доступен с нашим DMS Software Reengineering Toolkit.
DMS предоставляет обширную инфраструктуру для синтаксического анализа, построения дерева, построения таблиц символов и анализа потоков, преобразования источника в источник и регенерации исходного кода из (модифицированных) АСТ. (Он также обрабатывает многие другие языки, кроме как только С#.)
EDIT (сентябрь) 2013: этот ответ не был обновлен в последнее время. DMS давно обрабатывает С# 5.0
То, что набирает обороты и очень подходит для работы, Nemerle
вы можете увидеть, как это можно решить в этих видео из NDC:
GPPG может быть полезным, если вы хотите написать собственный парсер (что интересно).