Problema di dipendenza circolare

4

"Un singolo elemento in un set dipende dall'intero set. L'impostazione dipende da quell'elemento."

Sto creando un compilatore ( link ). Nell'ultima fase, il codice intermedio viene convertito in istruzioni macchina. Li ho rappresentati con le classi IntermediateCode e MachineCode .

Per farlo, sto utilizzando il Pattern ospite , che visita ciascuno degli elementi dell'elenco dei codici intermedi. Ogni codice intermedio può emettere uno o più codici macchina.

Funziona perfettamente, ma ho un grosso problema: una delle istruzioni che devono essere generate dipende dall'intero risultato ! Concretamente, c'è un'istruzione che ha bisogno di sapere che l'indice (ordinale) di un'altra istruzione non è ancora stato generato.

In altre parole, devo emettere un'istruzione che significa "spingere l'indirizzo di label X ", quando label X non è stato ancora emesso. L'indirizzo di tale etichetta sarà conosciuto solo quando tutte le istruzioni sono state emesse.

Illustrare meglio il problema, è simile alla creazione del sommario in un documento. Se vuoi essere in grado di creare il sommario, dove vuoi specificare il numero di pagina di una determinata sezione, devi prima generare tutto il documento, quindi puoi conoscere la pagina di una determinata sezione.

Puoi dirmi un algoritmo o un pattern per risolvere il mio problema? Non so come emettere quelle istruzioni per la correzione in sospeso .

Grazie mille!

    
posta SuperJMN 07.04.2018 - 11:40
fonte

1 risposta

8

È possibile eseguire una compilazione in due passaggi. Nel primo passaggio emetti le istruzioni della macchina come fai ora. Quando incontri un'etichetta, registra il suo indirizzo in una tabella dei simboli. Quando incontri un riferimento a un'etichetta, controlla la tabella dei simboli. Se non ha una voce per l'etichetta, crea una voce per l'etichetta ma lascia vuoto il suo indirizzo ed emette un segnaposto nello stream delle istruzioni della macchina. Nel secondo passaggio, inserisci i riferimenti dell'etichetta che non conoscevi durante il primo passaggio.

Introducendo la tabella dei simboli, l'etichetta e l'indirizzo dei concetti extra, si interrompono le dipendenze circolari.

    
risposta data 07.04.2018 - 12:12
fonte