縮排是如何解析的
在解析之前,空格由詞法分析器處理。
詞法分析器使用堆疊來儲存縮排級別。在開始時,堆疊只包含值 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
標記作為塊分隔符處理。