Skip to main content

Comandi - Analisi sintattica

D = Dichiarazioni

Un blocco corrisponde a D; C

C ::= skip | x := e | if b then c else c | while b do c | C; C | D; C

Distinzione tra ambiente e memoria

Ambiente:

  • Creato dalle dichiarazioni
  • Modificano la memoria come side-effect
  • Le modifiche sono reversibili

Memoria:

  • Non viene creato direttamente ma viene aggiornato dai comandi
  • Le modifiche sono irreversibili

Blocco

Il blocco viene utilizzato per identificare delle aree di codice, consente di organizzare la struttura del codice.

E' possibile creare dei blocchi inline (tra parentesi grafe), ovvero che isolano delle parti di codice (quindi separazione degli ambienti).

I blocchi inline non hanno un nome, pertanto sono definiti anonimi.

Quando apro un blocco all'interno di un altro blocco, devo prima chiudere il blocco interno e poi quello esterno.

Non possono quindi esistere blocchi interlacciati (REGOLA DI SCOPE / VISIBILITA' ).

Regola di scope (visibilità)

Una dichiarazione (assegnazione di un significato in un ambiente di riferimento) locale ad un blocco, è visibile nel blocco e in tutti i blocchi annodati a meno che non intervenga una nuova dichiarazione dello stesso nome.

{ const i = 3
...
{ var i:real = 1.2;
usando i qui, ci riferiamo al var i e non al const i.
lo scope della var i è quello del blocco corrente
ed eventuali blocchi annidati figli.
...
}
...
}

Scope statico

L'ambiente di riferimento di un uso è quello al momento della definizione del blocco.

L'ambiente di riferimento è una proprietà dell'uso di una variabile che stabilisce a quale dichiarazione fare riferimento per associare il valore (significato) all'identificatore.

Lo scope è una proprietà della dichiarazione che determina quali usi di identificatori fanno riferimento alla dichiarazione.

Se il nostro linguaggio utilizza scope statico, gli ambienti di riferimento sono noti a tempo di compilazione.

Variabile locale

La definizione "locale" intende locale ad un blocco (interna ad un blocco).

Una variabile locale è quindi una variabile definita all'interno di un blocco.

Variabile non locale

Una variabile non locale è una variabile visibile all'interno di un determinato blocco, ma non definita in quel medesimo blocco.

In questo contesto possiamo quindi affermare che la variabile è sicuramente definita in un blocco di livello superiore, che include al suo interno il blocco medesimo da cui la variabile è visibile.

Variabile globale

E' una variabile visibile a tutti i blocchi, estende quindi le variabili non locali, ed è definita nel blocco più esterno del codice.

Ambiente locale ad un blocco

Rappresenta l'insieme di tutte le dichiarazioni che vengono dichiarate all'interno del blocco.

Possiamo inoltre affermare che crea le variabili locali per quel blocco.

Ambiente non locale ad un blocco

Insieme di dichiarazioni visibili al blocco ma non dichiarate al suo interno.

Ambiente globale

Insieme di dichiarazioni comuni visibili a tutto il programma.

Variabili che rientrano in questo ambiente sono:

  • Dichiarazioni globali
  • Elementi del linguaggio

Tempo di vita di una variabile

Il tempo di vita di una variabile è il tempo in cui la variabile può essere usata e ha come riferimento la stessa locazione

{ const i = 3;
...
{ var i: real = 1.2;
...
la visibilità di var i è a partire da questo blocco e ai suoi annidati
...
}
...
la visibilità di const i è ciò che vi è fuori dal blocco var i,
sia prima che dopo il blocco.
...
}
{ while
...
{ D1;
C11;
...
{ D2;
C12;
...
}
C13;
...
}
...
}

Blocco

FI rappresentano gli identificatori liberi

FI(D;C) = FI(D) U (FI(C) \ DI(D))
DI(D;C) = DI(D) U DI(C)

Semantica statica per i comandi

Determina se il comando è ben formato, ovvero se rispetta i vincoli contestuali del comando.