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>();