Как анализируется отступ

Пробелы обрабатываются лексическим анализатором перед анализом.

Лексический анализатор использует стек для хранения уровней отступов. В начале, стек содержит только значение 0, которое является самой левой позицией. Всякий раз, когда начинается вложенный блок, новый уровень отступа помещается в стек, и токен INDENT вставляется в поток токенов, который передается анализатору. Там никогда не может быть больше , чем один «INDENT» маркер в строке ( IndentationError ).

Когда строка встречается с меньшим уровнем отступа, значения выталкиваются из стека до тех пор, пока значение не окажется сверху, равным новому уровню отступа (если ничего не найдено, возникает синтаксическая ошибка). Для каждого извлеченного значения генерируется токен DEDENT. Очевидно, что может быть несколько жетонов "DEDENT" подряд.

Лексический анализатор пропускает пустые строки (те, которые содержат только пробелы и, возможно, комментарии) и никогда не будет генерировать для них токены «INDENT» или «DEDENT».

В конце исходного кода токены «DEDENT» генерируются для каждого уровня отступа, оставленного в стеке, до тех пор, пока не останется только 0.

Например:

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

анализируется как:

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

 

Синтаксический анализатор обрабатывает токены "INDENT" и "DEDENT" как разделители блоков.