Какие парсеры доступны для разбора кода C #?
Я ищу синтаксический анализатор C #, который можно использовать в C # и предоставить мне доступ к информации о строках и файлах о каждом артефакте анализируемого кода.
Какие парсеры доступны для разбора кода C #?
Я ищу синтаксический анализатор C #, который можно использовать в C # и предоставить мне доступ к информации о строках и файлах о каждом артефакте анализируемого кода.
Ответы:
Работает над исходным кодом:
Работы по сборке:
Проблема с "синтаксическим анализом" сборки заключается в том, что у нас меньше информации о строке и файле (информация основана на файле .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
CodeDomProvider.Parse()
метод.
Если вы знакомы с ANTLR, вы можете использовать грамматику Antlr C # .
Я реализовал именно то, о чем вы просите (AST Parsing of C # code), в проекте OWASP O2 Platform с использованием SharpDevelop AST API.
Чтобы упростить использование, я написал быстрый API, который предоставляет ряд ключевых элементов исходного кода (с использованием операторов, типов, методов, свойств, полей, комментариев) и может переписать исходный код C # на C # и в VBNET. .
Вы можете увидеть этот API в действии в этом файле сценария O2 XRule: ascx_View_SourceCode_AST.cs.o2 .
Например, вот как вы обрабатываете текст исходного кода C # и заполняете несколько TreeView и TextBox:
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 (обратите внимание, что это мой первый проход при использовании парсера SharpDevelop C # AST, и я все еще не понимаю, как он работает):
Недавно мы выпустили парсер C #, который обрабатывает все функции C # 4.0 плюс новую функцию async: C # Parser и CodeDOM.
Эта библиотека генерирует семантическую объектную модель, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена. Он также поддерживает использование запросов LINQ для анализа исходного кода.
SharpDevelop , IDE с открытым исходным кодом, поставляется с анализатором кода на основе посетителей, который работает очень хорошо. Его можно использовать независимо от IDE.
Рассмотрите возможность использования отражения на встроенном двоичном файле вместо непосредственного анализа кода C #. API отражения действительно прост в использовании и, возможно, вы сможете получить всю необходимую информацию?
Взгляните на Gold Parser . Он имеет очень интуитивно понятный интерфейс, который позволяет вам в интерактивном режиме тестировать грамматику и генерировать код C #. С ним доступно множество примеров, и это совершенно бесплатно.
Может быть, вы могли бы попробовать Irony на сайте irony.codeplex.com.
Это очень быстро, и грамматика C # уже существует.
Сама грамматика написана прямо на C # в стиле BNF (достигается с некоторыми перегрузками операторов)
Самое лучшее в этом то, что «грамматика» производит AST напрямую.
То , что набирает обороты и очень подходит для работы в Nemerle
Вы можете увидеть, как это может решить эту проблему, в этих видеороликах от NDC:
Не на C #, но полный синтаксический анализатор C # 2/3/4, который строит полные AST, доступен с нашим DMS Software Reengineering Toolkit .
DMS предоставляет обширную инфраструктуру для синтаксического анализа, построения дерева, построения таблиц символов и анализа потоков, преобразования источника в источник и регенерации исходного кода из (модифицированных) AST. (Он также поддерживает многие другие языки, помимо C #.)
ИЗМЕНИТЬ (сентябрь) 2013 г .: этот ответ в последнее время не обновлялся. DMS давно работает с C # 5.0