Python Language Come l'indentazione è analizzata


Esempio

Lo spazio bianco viene gestito dall'analizzatore lessicale prima di essere analizzato.

L'analizzatore lessicale utilizza una pila per memorizzare i livelli di indentazione. All'inizio, la pila contiene solo il valore 0, che è la posizione più a sinistra. Ogni volta che inizia un blocco nidificato, il nuovo livello di indentazione viene inserito nello stack e un token "INDENT" viene inserito nel flusso di token che viene passato al parser. Non può mai esserci più di un gettone "INDENT" in una riga ( IndentationError ).

Quando viene rilevata una riga con un livello di indentazione più piccolo, i valori vengono estratti dallo stack fino a quando un valore è in cima, che è uguale al nuovo livello di indentazione (se non viene trovato nessuno, si verifica un errore di sintassi). Per ogni valore spuntato, viene generato un token "DEDENT". Ovviamente, possono essere presenti più token "DEDENT" in fila.

L'analizzatore lessicale salta le righe vuote (quelle che contengono solo spazi bianchi e probabilmente commenti) e non genererà mai token "INDENT" o "DEDENT" per loro.

Alla fine del codice sorgente, i token "DEDENT" vengono generati per ogni livello di rientro rimasto nello stack, fino a quando non viene lasciato solo lo 0.

Per esempio:

if foo:
    if bar:
        x = 42
else:
    print foo

viene analizzato come:

<if> <foo> <:>                    [0]
<INDENT> <if> <bar> <:>           [0, 4]
<INDENT> <x> <=> <42>             [0, 4, 8]
<DEDENT> <DEDENT> <else> <:>      [0]
<INDENT> <print> <foo>            [0, 2]
<DEDENT> 

Il parser gestisce i token "INDENT" e "DEDENT" come delimitatori di blocchi.