Nota: quando ho usato "complex" nel titolo, voglio dire che l'espressione ha molti operatori e operandi. Non che l'espressione stessa sia complessa.
Recentemente ho lavorato su un semplice compilatore per l'assembly x86-64. Ho finito il front-end principale del compilatore - il lexer e il parser - e ora sono in grado di generare una rappresentazione Abstract Syntax Tree del mio programma. E poiché il mio linguaggio sarà tipizzato staticamente, ora sto facendo la fase successiva: digita il codice sorgente. Tuttavia, ho riscontrato un problema e non sono stato in grado di risolverlo ragionevolmente.
Considera il seguente esempio:
Il parser del mio compilatore ha letto questa riga di codice:
int a = 1 + 2 - 3 * 4 - 5
E convertito nel seguente AST:
=
/ \
a(int) \
-
/ \
- 5
/ \
+ *
/ \ / \
1 2 3 4
Ora deve digitare controllare l'AST. inizia con il primo tipo controllando l'operatore =
. Prima controlla il lato sinistro dell'operatore. Vede che la variabile a
è dichiarata come un numero intero. Quindi ora deve verificare che l'espressione del lato destro valuti un intero.
Capisco come si potrebbe fare se l'espressione fosse solo un singolo valore, come 1
o 'a'
. Ma come si farebbe per espressioni con più valori e operandi - una espressione complessa - come quella sopra? Per determinare correttamente il valore dell'espressione, sembra che il correttore di tipi dovrebbe effettivamente eseguire l'espressione stessa e registrare il risultato. Ma questo sembra ovviamente vanificare lo scopo di separare le fasi di compilazione ed esecuzione.
L'unico altro modo in cui immagino possa essere fatto è quello di controllare ricorsivamente la foglia di ogni sottoespressione nell'AST e verificare che tutti i tipi di foglia corrispondano al tipo di operatore previsto. Quindi, partendo con l'operatore =
, il controllo di tipo dovrebbe eseguire la scansione di tutto l'AST del lato sinistro e verificare che i fogli siano tutti numeri interi. Dovrebbe quindi ripetere questo per ogni operatore nella sottoespressione.
Ho provato a cercare l'argomento nella mia copia di "Il libro del drago" , ma non lo fa Mi sembra di entrare in molti dettagli, e semplicemente ribadisce ciò che già so.
Qual è il solito metodo usato quando un compilatore è in grado di controllare le espressioni con molti operatori e operandi? Sono utilizzati i metodi sopra menzionati? In caso contrario, quali sono i metodi e come funzionano esattamente?