Подтвердить что ты не робот

Инструмент для синтаксического анализа С++ в AST

Пожалуйста, предложите готовый к использованию инструмент для синтаксического анализа кода С++ в абстрактное синтаксическое дерево? Рекомендуется использовать инструменты на основе Lex/Yacc, но все остальное также будет приемлемым.

4b9b3361

Ответ 1

Вы можете посмотреть gccxml. Однако он отбрасывает только структуру программы, а не код.

Если вы хотите больше, лучшим вариантом является, вероятно, CLang.

Обратите внимание, что синтаксис С++ не может быть легко проанализирован только с помощью анализатора Lex/Yacc. Это слишком неоднозначно.

Ответ 2

Как насчет clang?

Цель проекта Clang - создать новый компилятор C, С++, Objective C и Objective С++ для компилятора LLVM.

Ответ 3

Наш DMS C++ Front End - это полноценный анализатор C++ 11 с полным разрешением имени и типа. Он анализирует код C++, создает AST и таблицы символов, и с помощью своего программного обеспечения DMS Software Reengineering Toollkit может выполнять произвольные изменения в AST и восстанавливать действительный код. Он обрабатывает диалекты GCC, MS Visual Studio и включает в себя OpenMP.

DMS с C++ Front End использовались для проведения массовых изменений в больших системах кода.

РЕДАКТИРОВАТЬ Июнь 2013: см. Этот SO-ответ для примеров C++ AST, произведенных DMS.

РЕДАКТИРОВАТЬ Июнь 2016: Ручки C++ 14.

РЕДАКТИРОВАТЬ май 2019 года: ручки C++ 17

Ответ 4

Опция - fdump-translation-unit GCC компилятор генерирует абстрактное синтаксическое дерево для входных файлов:

Сбросить представление древовидной структуры для всей единицы перевода в файл. Имя файла создается путем добавления .tu к имени исходного файла.

Ответ 5

TXL используется как парсер С++, встроенный в коммерческую коммерческую IDE, которая продала сотни тысяч копий. Поэтому вопрос о том, может ли TXL сделать это, не является проблемой.

Тем не менее, грамматика TXL, используемая в этом продукте, является запатентованной и общедоступной. Свободная грамматика на языке С++, представленная на веб-сайте TXL, использовалась во многих проектах по обновлению С++, как отмечает Audrey154 выше, но не является коммерческим качеством, как указывает Ира Бакстер, и часто требует некоторой модификации для адаптации к источникам в конкретный проект.

Ответ 6

Попробуйте TXL (см. txl.ca). Также colm (complang.org)

Ответ 7

ROSE инфраструктура компилятора также является одним из вариантов. Это инфраструктура компилятора с открытым исходным кодом для создания инструментов преобразования и анализа программ источника-источника для крупномасштабных C (C89 и C98), С++ (С++ 98 и С++ 11), UPC, Fortran (77/95)/2003), OpenMP, Java, Python и PHP-приложения.

Таким образом, у него есть преимущество в том, что OpenMP не хватает clang.

Ответ 8

РЕДАКТИРОВАТЬ. Я оставляю для справки следующее: возможно, это будет полезно в будущем (если только для ANTLR, а не для грамматики С++). На данный момент, пожалуйста, рассмотрите комментарий Ира Бакстера о фактической пользе этого.

[Есть несколько С++-грамматик, доступных для ANTLR. Сам ANTLR может генерировать так называемый "парсер дерева", который позволяет вам работать с AST. Имея это, я не понимаю, насколько полные (или правильные) грамматики относятся к стандарту С++. Как всегда, YMMV.]

Ответ 9

eclipse CDT API прост в использовании, вы можете проверить коды и получить от него полезные UnitTests

Ответ 10

Пример c_json.py из https://github.com/eliben/pycparser может сделать это.

main()
{
    printf("hello, world\n");
}

дает

{
    "_nodetype": "FileAST", 
    "coord": null, 
    "ext": [
        {
            "_nodetype": "FuncDef", 
            "body": {
                "_nodetype": "Compound", 
                "block_items": [
                    {
                        "_nodetype": "FuncCall", 
                        "args": {
                            "_nodetype": "ExprList", 
                            "coord": "hello.c:3", 
                            "exprs": [
                                {
                                    "_nodetype": "Constant", 
                                    "coord": "hello.c:3", 
                                    "type": "string", 
                                    "value": "\"hello, world\\n\""
                                }
                            ]
                        }, 
                        "coord": "hello.c:3", 
                        "name": {
                            "_nodetype": "ID", 
                            "coord": "hello.c:3", 
                            "name": "printf"
                        }
                    }
                ], 
                "coord": "hello.c:2"
            }, 
            "coord": "hello.c:1", 
            "decl": {
                "_nodetype": "Decl", 
                "bitsize": null, 
                "coord": "hello.c:1", 
                "funcspec": [], 
                "init": null, 
                "name": "main", 
                "quals": [], 
                "storage": [], 
                "type": {
                    "_nodetype": "FuncDecl", 
                    "args": null, 
                    "coord": "hello.c:1", 
                    "type": {
                        "_nodetype": "TypeDecl", 
                        "coord": "hello.c:1", 
                        "declname": "main", 
                        "quals": [], 
                        "type": {
                            "_nodetype": "IdentifierType", 
                            "coord": "hello.c:0", 
                            "names": [
                                "int"
                            ]
                        }
                    }
                }
            }, 
            "param_decls": null
        }
    ]
}

Вы также можете получить LLVM AST в разборной форме, начиная с http://clang.llvm.org/docs/IntroductionToTheClangAST.html