Всего 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. я прошел сквозь этот так ответ и я получил некоторое вдохновение, но я все еще не знаю, как работать с терминальными узлами.
Задача ещё не решена.
Других решений пока нет …