下推自動機(PDA)
推入與彈出運算(push and pop)
堆疊只支援兩種基本動作,而它們正是你對一疊盤子所做的動作。推入(push)把一個新符號加到堆疊最上面,使盤堆升高一層。彈出(pop)移除目前最上面的符號,使盤堆降低一層,並露出底下原本的東西。這就是堆疊的全部詞彙——沒有「伸進中間」,沒有「讀下面第三個」。下推自動機對其記憶體所做的一切,都由這兩者構成。
在 PDA 中,這兩者通常合併成單一不可分割的動作。標準慣例是:每次轉移先「彈出」目前的頂端符號,然後在原位「推入」一串零個或多個符號。這一條規則統一了所有情況。推入空字串(彈出後不補任何東西)就是純彈出,使堆疊縮小。推回你彈出的那個符號、再多推一個,就是淨推入,使堆疊長高。推回完全相同的單一符號則高度不變,卻能讓機器改變狀態——一種「偷看後留在原地」。所以「彈出一個、推入一串」是一個靈活的單一運算,涵蓋了長高、縮小與不變。
這兩個運算正是堆疊如此自然地建模巢狀的原因。開啟一個括號就推入一個提醒;閉合一個就彈出它;而由於彈出總是取走最近一次推入的東西,最近開啟的括號就最先被比對並移除——恰恰是真實巢狀語法所遵守的紀律。你的 CPU 在每次函數呼叫(推入返回位址與區域變數)與返回(彈出它們)時做的也是同一對推入/彈出,這正是為什麼那個執行期結構就直接被叫做呼叫堆疊(call stack)。
替換頂端:一次轉移彈出 X 並推入 XX,使堆疊多一個 X;彈出 X 並不推入任何東西(ε)使其縮小;彈出 X 並推回 X 則高度不變。三者都寫成「彈出一個、推入一串」。
推入長高、彈出縮小;統一的 PDA 動作是「彈出頂端、再推入一串(可能為空)」。
PDA 無法讀取或改變頂端以下的任何東西。若需檢視被壓住的符號,必須先彈出其上的一切——而那些被彈出的符號就此消失,除非你把它們推回去。
又称
另见