I . 下推自動機 設計
設計下推自動機 , 可以識別 語言 ;
表示鏡面反射 , 如果 是由 組成的字符串 , 那麼 就是其鏡面反射 字符串 , 然後將 和 串聯在一起 , ;
1 . 首先生成開始狀態 ;
開始狀態是接受狀態 , 因爲如果字符串是空字符串 , 空字符串的鏡面反射還是空字符串 , 因此讀取空字符串後的狀態 , 是接受狀態 , 開始狀態其本身就是接受狀態 ;
2 . 向棧底放入 字符 , 用於作爲棧底的標識 , 生成 指令 ;
指令包含 部分 : 讀取字符 , 和 棧內操作 ;
-
讀取字符 : 指的是讀取的帶子上的字符串 , 中前面的 指的是從帶子上讀取 ;
-
棧內操作 : 使用某個字符 替換 棧頂字符 ; 中後面的 指的是使用 字符替換棧頂的空字符 ;
3 . 鏡面反射的前半個鏡面 :
入棧 : 每讀取一個 , 就將 放入棧中 , 生成指令 ;
入棧 : 每讀取一個 , 就將 放入棧中 , 生成指令 ;
4 . 跳轉到新的狀態 , 在新的狀態執行 後半個鏡面的操作 :
無條件跳轉就是讀取 , 並且棧中元素保持不變 , 即使用 替換棧頂的 ;
生成的指令爲
當前的下推自動機 :
5 . 鏡面反射的後半個鏡面 :
出棧 : 每讀取一個 , 從棧裏拿走一個 , 生成指令 ;
出棧 : 每讀取一個 , 從棧裏拿走一個 , 生成指令 ;
6 . 棧清空 , 跳轉到最後的 接受狀態 : 上述出棧操作執行若干次後, 總能將棧內的字符取出完畢 , 只剩下一個 字符 , 該字符是棧底的標識 ; 此時將 字符從棧內取出即可 ;
生成如下指令 :
指令含義是 讀取 字符 , 使用 字符替換棧中的 字符 ;
最後跳轉到的狀態是接受狀態 ;
當前下推自動機爲 :
II . 上下文無關語法 ( CFG ) 等價於 下推自動機 ( PDA )
假設某語言由 上下文無關語法 ( CFG ) 生成 , 找到一個 下推自動機 ( PDA ) 識別該語言 ;
構造下推自動機流程 ( PDA ) :
構造下推自動機 , 包含 個狀態 , 開始狀態 , Loop 循環狀態 , 可接受狀態 ;
1 . 開始狀態 :
讀取 字符 , 使用 替換棧頂的 , 對應的指令爲
其中的 是棧頂的標識 , 是棧內的實際字符 ;
2 . 循環階段 , 根據 上下文無關語法 ( CFG ) 做替換 ;
① 當棧頂是變元時 , 作變換 , 讀取 , 即什麼都不讀取 , 將棧頂的變元 替換成 , 生成的 下推自動機 指令爲 " " , 對應着的上下文無關語法規則爲 ;
② 當棧頂是終端字符 ( 常元 ) , 讓帶子上的 讀頭 讀取一個終端字符 , 對應的棧中 , 將棧頂的終端字符刪除 , 相當於使用 替換終端字符 , 生成指令 " " ;
一直讀取 終端字符 , 並將棧頂的終端字符刪除 , 一直循環該操作 , 直到 棧頂是一個變元 未爲止 ;
3 . 跳轉到 狀態 : 當棧內的字符都出棧後 , 只剩下一個 字符作爲棧底標識 , 此時 出棧 , 生成對應的 下推自動機指令 " " , 即使用空字符 替換棧內的 字符 ;
之後跳轉到最後一個狀態 , 可接受狀態 ;