ANTLR-подобный API для clang AST
Всего Clang/ LLVM N00B здесь. Я создаю многоязычный инструмент статического анализа, который имеет парсеры для отдельных языков и экспортирует AST с независимой маркировкой языка для обработки одного двоичного файла анализатора. До сих пор я использовал нативные парсеры для Ruby и Go и ANTLR для Swift.
В частности, ANTLR покорил меня благодаря API слушателя, в котором предусмотрено 3 универсальных метода:
void enterEveryRule(ParserRuleContext ctx)
void exitEveryRule(ParserRuleContext ctx)
void visitTerminal(TerminalNode node)
Вы также можете подписаться на enter
а также exit
события для определенных правил, которые вы находите особенно интересными. Таким образом, для данного правила у вас будет четыре обратных вызова - enterEveryRule
, enterParticularRule
, exitParticularRule
, exitEveryRule
- в этом конкретном порядке. Существует также концепция TerminalNode
с вещами вроде литералов и т. д.
Так как это своего рода API, который кажется наиболее естественным для стоящей перед нами задачи, я хотел бы попросить вашего совета о том, как выполнить его репликацию в Clang. Я прошел этот SO-ответ и получил вдохновение, но я все еще не знаю, как работать с терминальными узлами.