Use o ponteiro de função para tornar o analisador mais claro.

Quando cada função de análise deseja chamar recursivamente outra função de análise, buildTree () será chamada primeiro.
Isso torna a função de análise mais clara e mais legível.

Exemplo:

void parse_PS() {
if(lookahead == NT) {
buildTree
(&parse_P, "P");
buildTree
(&parse_PS, "PS");
} else if(lookahead == EOF) {
} else {
syntaxError
();
}
}

void buildTree(void (*parseFunc)(), char *id) {
addChild
(id);

// Simulate a tree
enterTree
();
(*parseFunc)();
leaveTree
();
}

Fonte: https://github.com/xsoameix/LL-1-table-builder/blob/develop/app/Parser.c