縮排是如何解析的

在解析之前,空格由詞法分析器處理。

詞法分析器使用堆疊來儲存縮排級別。在開始時,堆疊只包含值 0,這是最左邊的位置。每當巢狀塊開始時,新的縮排級別被推入堆疊,並且 INDENT 標記被插入到令牌流中,該令牌流被傳遞給解析器。一行中永遠不會有多個 INDENT 標記(IndentationError)。

當遇到具有較小縮排級別的行時,將從堆疊中彈出值,直到值在頂部,該值等於新縮排級別(如果未找到,則發生語法錯誤)。對於彈出的每個值,將生成 DEDENT 標記。顯然,連續可能有多個 DEDENT 令牌。

詞法分析器會跳過空行(僅包含空格和可能的註釋),並且永遠不會為它們生成 INDENTDEDENT 標記。

在原始碼的末尾,為堆疊上剩下的每個縮排級別生成 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> 

解析器將 INDENTDEDENT 標記作為塊分隔符處理。