Il tuo problema è simile a quello che deve affrontare un assembler con le istruzioni di salto.
Quando un programma in assembly contiene un'istruzione di salto con un'etichetta che è definita più avanti nel file, l'assembler non conosce l'indirizzo dell'etichetta in questione(forward references).
In questo caso l'assembler effettua due passate nel file di input(buona, dunque, la tua idea iniziale. L'AST non va bene, ma credevo che tu dovessi risolvere un problema simile a quello dell'esempio che ti ho linkato).
Nella prima passata costruisci una tabella dei simboli(ti consiglio di utilizzare una hash-table).
Nella seconda passata, ogni volta che incontri un identificatore, lo cerchi nella tabella dei simboli e ne ricavi le informazioni che ti necessitano.
Ricordati di riportare il puntatore all'inizio del file prima della seconda chiamata alla funzione yyparse:
codice:
fseek(yyin, 0, SEEK_SET);
codice:
...
...
yyparse (st);
fseek(yyin, 0, SEEK_SET);
second_time = true;
SystemObject * st2 = new SystemObject();
yyparse(st2);
...
...