Парсер для 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.