Accéder aux tokens par leur nom
Par exemple, pour la grammaire :
grammar foo;
// ...
ID
: [A-Za-z]+
;
Dans le code C++, on peut ensuite récupérer le token en utilisant son nom comme dans par exemple le cas d'un listener :
void MyListener::enterMyRule(FooParser::MyRuleContext *ctx) {
tree::TerminalNode* node = ctx->getToken(FooParser::ID, 0);
}
Ou encore plus simple :
ctx->ID();
Implémentation des visiteurs
Pour implémenter les visiteurs, il faut tout d'abord créer toutes les classes qui représentent les noeuds de l'AST. Ces classes doivent hériter de antlrcpp::Any
et des instances de ces classes doivent être utilisées comme valeur de retour :
antlrcpp::Any Builder::visitFunctionDef(...) {
// ...
return ASTFunction(name, ...);
}
Dans la règle racine de la grammaire, il faut ensuire récupérer les noeuds de l'AST renvoyés par ces fonctions et les caster vers la classe voulue en utilisant :
antlrcpp::Any astNode = visitMyRule(ctx);
ASTFunction function = astNode.as<ASTFunction>();