Пожалуйста, предложите готовый к использованию инструмент для синтаксического анализа кода С++ в абстрактное синтаксическое дерево? Рекомендуется использовать инструменты на основе Lex/Yacc, но все остальное также будет приемлемым.
Инструмент для синтаксического анализа С++ в AST
Ответ 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