Domanda

Oggi ero in classe, in un corso di traduzioni linguistiche, pensando al modo migliore per scrivere una tabella dei simboli per un compilatore. Il mio professore ci ha mostrato un tavolo da hash con liste collegate che collegano diversi livelli di "blocchi", che di solito sono parentesi ricci in lingue come C.

Il mio pensiero era: cosa c'è di sbagliato nell'uso invece di stack?

Ad esempio, ecco un po 'di codice:

int x = 5;
float y = 3;
{
    // stuff
    int x = 100; 
}

Non sarei in grado di iniziare, hashing x, spingendolo su una struttura di stack come

struct symbol_def{
    char * type;
    val_type value;
}

Non so come fare un tipo dinamico per il valore (se il valore è persino necessario lì dentro).

Quando arriva la seconda X:

int x = 100;

Poi abbiamo appena Hash X, spingiamo sullo stack.

In qualsiasi momento, la parte superiore delle pile è la visibilità dell'ambito attuale.

Il problema potrebbe venire con il popping comunque. Come facciamo fuori le cose giuste? Quello non sono del tutto sicuro e potrebbe essere un difetto fatale di questo design.

In teoria, questo sarebbe un sacco di posti di lavoro (1) (ricerca della tabella hash, spingendo, scoppiettando, sbirciando).

Fatemi sapere i vostri pensieri. Forse mi manca qualcosa qui, o forse è così che è già fatto.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top