Come si calcola se è garantita la variabile impostata?

2

Supponendo che le dichiarazioni siano espressioni considera tale codice:

if ((var x = foo()) and (var y = x)) or (var z = bar()) then
  println(z);
end

Il riferimento a x è OK, perché a questo punto% deve essere impostato% co_de, ma il riferimento a x (in z ) non lo è. Può essere valido o meno.

Vorrei calcolare questi due "stati" di variabili - se è corretto fare riferimento a variabili (è garantito che sia impostato) o no (non è impostato con certezza, o è forse impostato).

Come si fa?

Aggiornamento : ho trovato questa pagina wiki link e penso che il mio caso sia molto più semplice . Devo tenere traccia di 4 tipi di flusso - e, o, xor, successivo (operatore virgola, da predicato a corpo). Spero di avere ragione: -)

    
posta greenoldman 26.03.2016 - 17:59
fonte

1 risposta

2

Quello che stai chiedendo è una forma di analisi del flusso di dati. Il codice potrebbe essere tradotto in una qualche forma di blocchi di base (o altra struttura di dati intermedia). Ci sarà un flusso di controllo (rami) associato alle espressioni AND e OR nel test della condizione if (così come i rami associati a saltare attorno alla parte). I blocchi di base vengono analizzati per generare e utilizzare una struttura dati con un bit di stato per ciascuna variabile che indica se è inizializzata o meno.

Se ci sono loop potenzialmente nei blocchi di base che vengono analizzati, le cose diventano più complicate, potrebbe essere necessario iterare (ad esempio fino a quando non vengono apportate modifiche).

Quando i blocchi di base si uniscono (cioè da "or"), o dopo un if-then o if-then-else, allora effettivamente E questi bit insieme, così che quando un bit per una variabile particolare su uno dei i percorsi di fusione sono chiari, quindi il risultato alla fusione è che il bit per quella variabile è chiaro. Ogni volta che viene utilizzata una variabile (vale a dire nel tuo caso come nella parte allora), controlli lo stato corrente del bit per quella variabile e segnala l'errore se il bit è chiaro.

    
risposta data 26.03.2016 - 18:13
fonte

Leggi altre domande sui tag