it-swarm-ru.tech

Парсер для C #

Какие парсеры доступны для анализа кода C #?

Я ищу синтаксический анализатор C #, который можно использовать в C # и дать мне доступ к информации о строках и файлах каждого артефакта анализируемого кода.

99
Julien Hoarau

Работает над исходным кодом:

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

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

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

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

116
Julien Hoarau

Mono (с открытым исходным кодом) включает в себя компилятор C # (и, конечно, парсер)

7
aku

Если вы собираетесь скомпилировать 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

6
zproxy

Если вы знакомы с ANTLR, вы можете использовать Antlr C # грамматика .

5
prosseek

Я реализовал только то, что вы просите (синтаксический анализ AST кода C #) в проекте OWASP O2 Platform , используя SharpDevelop AST API.

Чтобы упростить его использование, я написал быстрый 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, и я все еще размышляю над тем, как он работает):

4
Dinis Cruz

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

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

3
Ken Beckett
2
Galwegian

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

2
Akselsson

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

2
Hallgrim

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

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

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

Лучше всего то, что "грамматика" создает AST напрямую.

2
SeeSoft

Посмотрите на Gold Parser . Он имеет очень интуитивно понятный IU, который позволяет вам в интерактивном режиме тестировать свою грамматику и генерировать код C #. Есть много примеров, доступных с этим, и это абсолютно бесплатно.

2
sbeskur

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

2
Jason

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

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

1
Stéphane

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

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

РЕДАКТИРОВАТЬ (сентябрь) 2013: Этот ответ не был недавно обновлен. DMS долго занимался C # 5.0

1
Ira Baxter