從左往右掃描
每進入一個新迴圈,stack 就 push 一個 Loop ( 一開始就要 push 一個 Loop )
Loop 有 5 個 fields:repeat_times、leading、start、end、distance
repeat_times 為重複次數
leading 為上一個迴圈最後的指針位置 ( 如果是連續迴圈如 LxLy,則剛好會是 None )
start 為該迴圈第一個指針位置,初始化為 None ( 因為還沒解析到第一個指針位置,所以初始化成 None )
end 為該迴圈目前指針位置,初始化為 None ( 初始化為 None 的原因同上 )
distance 為該迴圈指針走一次的距離,初始化為 0
其中 repeat_times 和 leading 要在解析迴圈 Lx 時就設定
【處理 T】
如果當前迴圈的 start 為 None,設定 start 的指針位置
這時不將指針距離差 加到當前迴圈的 distance,因為迴圈重複時不會把指針移到 leading,而是移到 start,故不累計
如果 start 不為 None,則將指針距離差 加到 distance
無論 start 是否為 None,都需要更新當前迴圈的 end 為新的指針位置
【處理 L】
建立新 Loop 並 push 進 stack
【處理 E】
pop 出 stack 最上面的 Loop ( 我叫他 popped )
並計算 popped 的總距離,為以下三個相加
(1) 進入迴圈時指針移動距離 = | start - leading | ( 如果 leading 不為 None )
(2) 迴圈 distance 重複的距離 = repeat_times * distance
(3) 迴圈指針回歸(rewind)重複的距離 = repeat_times * (| start - end |)
並將 popped 的總距離加到目前迴圈的 distance
接著檢查目前迴圈的 start 是否為 None,如果是,設定為 popped.start
最後更新目前迴圈的 end 為 popped.end