Как Чтобы использовать AST от Clang?

Индексы подразумевают много сравнений.

Как правило, строки длиннее, чем целые числа и правила сопоставления могут быть применены для сравнения, так сравнение представляет в виде строки, обычно более в вычислительном отношении интенсивная задача, чем сравнение целых чисел.

Иногда, тем не менее, это быстрее для использования строки в качестве первичного ключа, чем сделать дополнительное соединение с string to numerical id таблица.

23
задан thatWiseGuy 6 November 2015 в 21:59
поделиться

3 ответа

Вероятно, вам нужен стабильный C API, предоставляемый в библиотеке libclang, в отличие от нестабильных внутренних API C ++, о которых упоминали другие.

Лучшая документация для начала - видео / слайды выступления «libclang: Thinking Beyond the Compiler», доступного на веб-сайте LLVM Developers Meeting .

Тем не менее, обратите внимание, что стабильность API достигается ценой комплексности. Вы не сможете сделать все с этим API, но его гораздо проще использовать.

9
ответ дан 29 November 2019 в 02:50
поделиться

Я считаю этот ASTUnit :: LoadFromCompilerInvocation () fn наиболее простым способом построения AST.

Эта ссылка может дать вам некоторые идеи http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471

1
ответ дан 29 November 2019 в 02:50
поделиться

Чтобы получить AST, а также познакомиться с этапами внешнего интерфейса, в книге «Основные библиотеки LLVM» есть глава о внешнем интерфейсе. В основном он имеет такой поток (в случае llvm-4.0.1 и должен быть похожим для более поздних версий):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

Последняя функция обрабатывает всю единицу перевода (decls верхнего уровня уже обрабатываются в этой точке) и вызывает EmitBackendOutput, чтобы сделать backend вещи. Так что эта функция является хорошим местом, где вы можете что-то сделать с полным AST и до выдачи выходных данных бэкэнда.

С точки зрения того, как манипулировать AST, у clang есть несколько основных руководств по этому вопросу: http://clang.llvm.org/docs/RAVFrontendAction.html .

Также посмотрите на ASTDumper.cpp. Это лучший пример посещения АСТ.

Еще один хороший учебник: https://jonasdevlieghere.com/understanding-the-clang-ast/ научит вас, как найти конкретный оператор вызова в AST с помощью трех разных подходов.

0
ответ дан 29 November 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: