Bison: dov’è l’ultimo valore $$ memorizzato nel parser puro-push?

Ho scritto una definizione del parser, che si interfaccia con python come estensione. Ho dichiarato le seguenti opzioni, in modo che Bison generi un parser push reentrant:

%define api.pure full %define api.push-pull push 

Per passare valori semantici a Python attraverso la sua API C, ho dichiarato che YYSTYPE doveva essere PyObject* come segue:

 %define api.value.type {PyObject*} 

Ora, l’ultima regola (“accettando”) ha la seguente azione:

 full : declarations data { $$ = Py_BuildValue("(s, O, O)", "full", $1, $2); } ; 

La funzione Py_BuildValue crea qui un object tupla contenente una stringa e altri due oggetti di un tipo arbitrario e restituisce un puntatore PyObject* su di esso.

Dato che chiamo il parser nel modo seguente:

 token_index = 0; yypstate* ps = yypstate_new(); do{ token_id = get_token_id(token_index); semval = semvals[token_index]; state = yypush_parse(ps, token_id, &semval); token_index += 1; } while (state == YYPUSH_MORE); 

… come posso accedere al valore generato dalla regola full (cioè il suo $$ )?

Ho provato yylval e yyval , e sembra che non siano definiti. Ho il sospetto che il puntatore al valore possa essere memorizzato da qualche parte nella struttura ps , ma non riesco a trovare alcuna documentazione su di esso.

Lo stack viene deallocato alla fine del parse, quindi qualunque cosa sia stata spacciata come $$ svanirà. Se si desidera restituire un valore, è necessario fornire un argomento aggiuntivo al parser push che punta al punto in cui archiviare il risultato, anziché assegnarlo a $$ .