Парсер для C #


101

Які парсери доступні для розбору коду C #?

Я шукаю аналізатор C #, який можна використовувати в C #, і надає мені доступ до інформації про рядки та файли про кожен артефакт аналізованого коду.

Відповіді:


118

Працює над вихідним кодом:

  • CSParser : від C # 1.0 до 2.0, з відкритим кодом
  • Metaspec C # Parser : від C # 1.0 до 3.0, комерційний продукт (близько 5000 $)
  • # визнати! : Від C # 1.0 до 3.0, комерційний продукт (близько 900 €) (відповідь SharpRecognize )
  • SharpDevelop Parser (відповідь Аксельссон )
  • NRefactory : від C # 1.0 до 4.0 (+ async), з відкритим кодом, аналізатор, що використовується в SharpDevelop. Включає семантичний аналіз.
  • C # Parser та CodeDOM : Повний Cser 4.0 аналізатор, вже підтримує функцію асинхронізації C # 5.0. Комерційний продукт (від 49 до 299 $) (відповідь Кен Бекетт )
  • Microsoft Roslyn CTP : Компілятор як послуга.

Роботи по складанню:

Проблема зі складанням "розбору" полягає в тому, що ми маємо менше інформації про рядки та файли (інформація базується на файлі .pdb, а Pdb містить інформацію про рядки лише для методів)

Я особисто рекомендую Mono.Cecil та NRefactory .


1
CS-Script ( csscript.net ) - Скрипт двигуна C # може відповідати цьому списку. Зразок "Представлення Microsoft CTP" Roslyn "дуже схожий на CS-скрипт.
— Дмитро Лагода

1
Хоча ви згадуєте про витрати, зауважте, що Roslyn вимагає принаймні Pro версії Visual Studio.
— Крістіанп

7

Mono (відкритий код) включає компілятор C # (і звичайно аналізатор)


Яка перевага використання Mono над іншими аналізаторами? Чи можу я отримати інформацію про AST програми C # за допомогою відвідувача? Якщо так, чи можете ви направити мене на сторінку, яка показує сторінку для цього?
— yeeen

6

Якщо ви збираєтеся збирати 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


1
Особливо дивіться на CodeDomProvider.Parse()метод.
— Дон Кіркбі

3
Ні, не дивіться на метод CodeDomProvider.Parse (), який видає NotImplemented виняток у публічних складах! (Visual Studio використовує власний внутрішній аналізатор).
— Робін Девіс


4

Я реалізував саме те, що ви запитуєте (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, і я все ще оглядаю, як це працює):


Так, це здається найпростішим з рішень, принаймні, виходячи з того, що я бачив. Я шукав гідний аналізатор і натрапив на цей блог svengrand.blogspot.com/2010/10/…, який також детально розповідає про те, як використовувати аналізатор C # SharpDevelop.
— Олексій

3

Нещодавно ми випустили аналізатор C #, який обробляє всі функції C # 4.0 плюс нову функцію асинхронізації: C # Parser та CodeDOM

Ця бібліотека генерує семантичну модель об'єкта, яка зберігає коментарі та інформацію про форматування і може змінюватися та зберігатися. Він також підтримує використання LINQ-запитів для аналізу вихідного коду.



2

SharpDevelop , IDE з відкритим кодом, поставляється з кодовим аналізатором на основі відвідувачів, який працює дуже добре. Його можна використовувати незалежно від IDE.


2

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


3
Рефлексія - це поганий спосіб статичного аналізу; він надає лише ту інформацію, яку може витягувати логіка відображення (наприклад, "назви методів у класі". Вона не забезпечує детальну інформацію ("яка права частина цього завдання?")) і настільки сильно обмежує такий вид статики аналіз можна зробити
— Іра Бакстер

@Ira Baxter Є деякі обмеження, але пам’ятайте, що ви також можете отримати код IL за допомогою відображення. Це означає, що ви можете зрозуміти, які методи викликаються, які присвоєні яким змінним тощо. Я не можу придумати багато випадків, коли цього недостатньо. Подивіться, що всі плагіни Reflector можуть зробити.
— Hallgrim

як ви отримуєте фактичний код IL за допомогою Reflection? Наскільки мені відомо, що Reflection цього не забезпечує, і вам потрібно використовувати CCI Див.: Stackoverflow.com/questions/2824086/…
— Еш,

2

Погляньте на Золотий Парсер . Він має дуже інтуїтивний IU, який дозволяє вам інтерактивно перевіряти граматику та генерувати код C #. З ним доступно безліч прикладів, і це абсолютно безкоштовно.


2
ОП попросила щось, що може розібрати C #, а не те, що в C #, що розбере щось інше.
— Іра Бакстер

2

Можливо, ви можете спробувати з Irony на irony.codeplex.com.

Це дуже швидко, і вже існує гра # граматика.

Сама граматика записується безпосередньо в c # подібним чином BNF (це досягається, коли деякі оператори перевантажують)

Найкраще в тому, що "граматика" виробляє AST безпосередньо.


У коментарі в Irony.Samples / CSharp / CSharpGrammar.cs сказано: "ПРИМІТКА. Ця граматика - це просто демонстрація, і вона є непрацездатною демонстрацією". Тож принаймні це не повна реалізація.
— vladich

2

Ви обов'язково повинні перевірити Рослін, оскільки MS щойно відкрила (або незабаром відкриє) код з ліцензією Apache 2 тут . Ви також можете перевірити спосіб аналізу цієї інформації за допомогою цього коду від GitHub .


1

Щось, що набирає обертів і дуже підходить для роботи, це Немерле

ви можете побачити, як це можна було вирішити в цих відео з NDC:


Nemerle - мова програмування. Приємна мова програмування, я згоден, але питання полягало в тому, як розібрати C # код всередині C #!
— Qwertie

ви створюєте правила в німері та використовуєте їх із C #, нічого не говорив, що аналізатор повинен бути у C #, але що б там не було.
— Стефан

1

Не в C #, але повний аналізатор C # 2/3/4, який створює повні AST, доступний за допомогою нашого інструментарію реінжинірингу програмного забезпечення DMS .

DMS забезпечує широку інфраструктуру для розбору, побудови дерев, побудови таблиць символів та аналізу потоків, перетворення джерела в джерело та відновлення вихідного коду з (модифікованих) AST. (Він також обробляє багато інших мов, ніж лише C #.)

EDIT (вересень) 2013 року: Ця відповідь нещодавно не оновлена. DMS вже давно обробляє C # 5.0


-1

GPPG може бути корисним, якщо ви готові написати власний аналізатор (що цікаво).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.