Python Language Comment l'indentation est analysée


Exemple

Les espaces blancs sont traités par l'analyseur lexical avant d'être analysés.

L'analyseur lexical utilise une pile pour stocker les niveaux d'indentation. Au début, la pile contient juste la valeur 0, qui est la position la plus à gauche. Chaque fois qu'un bloc imbriqué commence, le nouveau niveau d'indentation est poussé sur la pile et un jeton "INDENT" est inséré dans le flux de jetons qui est transmis à l'analyseur. Il ne peut jamais y avoir plus d'un jeton "INDENT" dans une ligne ( IndentationError ).

Lorsqu'une ligne est rencontrée avec un niveau d'indentation plus petit, les valeurs sont extraites de la pile jusqu'à ce que la valeur soit supérieure au nouveau niveau d'indentation (si aucune valeur n'est trouvée, une erreur de syntaxe se produit). Pour chaque valeur sautée, un jeton "DEDENT" est généré. De toute évidence, il peut y avoir plusieurs jetons "DEDENT" à la suite.

L'analyseur lexical ignore les lignes vides (celles ne contenant que des espaces et éventuellement des commentaires) et ne générera jamais de jeton "INDENT" ou "DEDENT" pour ces dernières.

A la fin du code source, des jetons "DEDENT" sont générés pour chaque niveau d'indentation laissé sur la pile, jusqu'à ce qu'il ne reste que le 0.

Par exemple:

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

est analysé comme:

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

L'analyseur traite les jetons "INDENT" et "DEDENT" en tant que délimiteurs de bloc.