Парсер для 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 : полный синтаксический анализатор C # 4.0, уже поддерживающий асинхронную функцию C # 5.0. Коммерческий продукт (от 49 до 299 долларов) (ответ Кена Беккета )
  • Microsoft Roslyn CTP : компилятор как услуга.

Работы по сборке:

Проблема с "синтаксическим анализом" сборки заключается в том, что у нас меньше информации о строке и файле (информация основана на файле .pdb, а Pdb содержит информацию о строках только для методов)

Я лично рекомендую Mono.Cecil и NRefactory .


1
CS-Script ( csscript.net ) - этот список может содержать C # Script Engine. Пример «Знакомство с Microsoft« Roslyn »CTP» очень похож на CS-скрипт.
Дмитрий Лагода

1
Пока вы упоминаете о затратах, обратите внимание, что для Roslyn требуется как минимум версия Visual Studio Pro.
kristianp

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 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, и я все еще не понимаю, как он работает):


Да, это кажется самым простым решением, по крайней мере, исходя из того, что я видел. Я искал достойный парсер и наткнулся на этот блог svengrand.blogspot.com/2010/10/…, в котором также подробно рассказывается, как использовать парсер C # SharpDevelop.
Alex

3

Недавно мы выпустили парсер C #, который обрабатывает все функции C # 4.0 плюс новую функцию async: C # Parser и CodeDOM.

Эта библиотека генерирует семантическую объектную модель, которая сохраняет комментарии и информацию о форматировании и может быть изменена и сохранена. Он также поддерживает использование запросов LINQ для анализа исходного кода.



2

SharpDevelop , IDE с открытым исходным кодом, поставляется с анализатором кода на основе посетителей, который работает очень хорошо. Его можно использовать независимо от IDE.


2

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


3
Отражение - плохой способ проводить статический анализ; он предоставляет только ту информацию, которую может извлечь логика отражения (например, «имена методов в классе». Он не предоставляет подробной информации («что это за правая часть этого назначения?») и так сильно ограничивает этот вид статики анализ можно сделать.
Ира Бакстер

@Ira Baxter Есть некоторые ограничения, но помните, что вы также можете получить код IL через отражение. Это означает, что вы можете понять, какие методы вызываются, какие переменные назначаются и т. Д. Я не могу вспомнить многих случаев, когда этого недостаточно. Просто посмотрите, на что способны все плагины Reflector.
Халлгрим

как получить реальный код IL через Reflection? Насколько мне известно, Reflection этого не обеспечивает, и вам необходимо использовать CCI. См .: stackoverflow.com/questions/2824086/…
Эш

2

Взгляните на Gold Parser . Он имеет очень интуитивно понятный интерфейс, который позволяет вам в интерактивном режиме тестировать грамматику и генерировать код C #. С ним доступно множество примеров, и это совершенно бесплатно.


2
OP попросил что-то, что может анализировать C #, а не что-то в C #, которое анализирует что-то еще.
Ира Бакстер,

2

Может быть, вы могли бы попробовать Irony на сайте irony.codeplex.com.

Это очень быстро, и грамматика C # уже существует.

Сама грамматика написана прямо на C # в стиле BNF (достигается с некоторыми перегрузками операторов)

Самое лучшее в этом то, что «грамматика» производит AST напрямую.


Комментарий в Irony.Samples / CSharp / CSharpGrammar.cs гласит: «ПРИМЕЧАНИЕ. Эта грамматика - всего лишь демонстрация, и это неработающая демонстрация». По крайней мере, это не полная реализация.
vladich

2

Вам обязательно стоит попробовать Roslyn, поскольку MS только что открыла (или скоро откроет) код с лицензией Apache 2 здесь . Вы также можете проверить способ синтаксического анализа этой информации с помощью этого кода с GitHub .


1

То , что набирает обороты и очень подходит для работы в Nemerle

Вы можете увидеть, как это может решить эту проблему, в этих видеороликах от NDC:


Nemerle - это язык программирования. Я согласен, хороший язык программирования, но вопрос был в том, как разбирать код C # внутри C #!
Qwertie

вы создаете правила в nemerle и используете их из C #, ничего не сказано, что синтаксический анализатор должен быть на C #, но что бы то ни было, откажитесь.
Стефан

1

Не на C #, но полный синтаксический анализатор C # 2/3/4, который строит полные AST, доступен с нашим DMS Software Reengineering Toolkit .

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

ИЗМЕНИТЬ (сентябрь) 2013 г .: этот ответ в последнее время не обновлялся. DMS давно работает с C # 5.0


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.