Які парсери доступні для розбору коду C #?
Я шукаю аналізатор C #, який можна використовувати в C #, і надає мені доступ до інформації про рядки та файли про кожен артефакт аналізованого коду.
Які парсери доступні для розбору коду C #?
Я шукаю аналізатор C #, який можна використовувати в C #, і надає мені доступ до інформації про рядки та файли про кожен артефакт аналізованого коду.
Відповіді:
Працює над вихідним кодом:
Роботи по складанню:
Проблема зі складанням "розбору" полягає в тому, що ми маємо менше інформації про рядки та файли (інформація базується на файлі .pdb, а Pdb містить інформацію про рядки лише для методів)
Я особисто рекомендую Mono.Cecil та NRefactory .
Якщо ви збираєтеся збирати 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 Парсинг коду C #) на проекті платформи OWASP O2, використовуючи API AST SharpDevelop.
З метою полегшення споживання я написав швидкий 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, і я все ще оглядаю, як це працює):
Нещодавно ми випустили аналізатор C #, який обробляє всі функції C # 4.0 плюс нову функцію асинхронізації: C # Parser та CodeDOM
Ця бібліотека генерує семантичну модель об'єкта, яка зберігає коментарі та інформацію про форматування і може змінюватися та зберігатися. Він також підтримує використання LINQ-запитів для аналізу вихідного коду.
SharpDevelop , IDE з відкритим кодом, поставляється з кодовим аналізатором на основі відвідувачів, який працює дуже добре. Його можна використовувати незалежно від IDE.
Подумайте використовувати відображення на вбудованому двійковому, а не безпосередньо розбирати код C #. API відображення дійсно простий у використанні і, можливо, ви можете отримати всю необхідну інформацію?
Погляньте на Золотий Парсер . Він має дуже інтуїтивний IU, який дозволяє вам інтерактивно перевіряти граматику та генерувати код C #. З ним доступно безліч прикладів, і це абсолютно безкоштовно.
Можливо, ви можете спробувати з Irony на irony.codeplex.com.
Це дуже швидко, і вже існує гра # граматика.
Сама граматика записується безпосередньо в c # подібним чином BNF (це досягається, коли деякі оператори перевантажують)
Найкраще в тому, що "граматика" виробляє AST безпосередньо.
Щось, що набирає обертів і дуже підходить для роботи, це Немерле
ви можете побачити, як це можна було вирішити в цих відео з NDC:
Не в C #, але повний аналізатор C # 2/3/4, який створює повні AST, доступний за допомогою нашого інструментарію реінжинірингу програмного забезпечення DMS .
DMS забезпечує широку інфраструктуру для розбору, побудови дерев, побудови таблиць символів та аналізу потоків, перетворення джерела в джерело та відновлення вихідного коду з (модифікованих) AST. (Він також обробляє багато інших мов, ніж лише C #.)
EDIT (вересень) 2013 року: Ця відповідь нещодавно не оновлена. DMS вже давно обробляє C # 5.0