【計算理論】上下文無關語法 ( CFG ) 轉爲 下推自動機 ( PDA )





I . 上下文無關語法 ( CFG ) 轉爲 下推自動機 ( PDA )



上下文無關語法 ( CFG ) :

SaTbbS \to aTb | b
TTaεT \to Ta|\varepsilon


將上述 上下文無關語法 ( CFG ) 轉爲 下推自動機 ;





II . 下推自動機 ( PDA ) 三個狀態



該 自動機 共包含 33 個狀態 , qstartq_{start} , qloopq_{loop} , qacceptq_{accept} , 最後一個狀態是 可接受狀態 ;

在這裏插入圖片描述





III . 下推自動機 ( PDA ) qstartq_{start} 狀態



1 . 首先在 棧頂 放入 KK 字符 , 用於當做棧底的標識 ;


生成指令 : ε,εK\varepsilon , \varepsilon \to K ;

開始狀態 qstartq_{start} 狀態 , 讀取 ε,εK\varepsilon , \varepsilon \to K 指令 , 讀取空字符 , 使用 KK 替換棧頂的空字符 , 就是將 KK 放入棧中 ;

狀態跳轉 : 之後跳轉到 qloopq_{loop} 狀態 ;


當前的 下推自動機 ( CFG ) 設計 :
在這裏插入圖片描述





IV . 下推自動機 ( PDA ) qloopq_{loop} 狀態



1 . qloopq_{loop} 狀態下 在棧中模仿 上下文無關語法 ( CFG ) 的規則替換 ;


上下文無關語法 ( CFG ) :

SaTbbS \to aTb | b
TTaεT \to Ta|\varepsilon


2 . 對照上述 上下文無關語法 ( CFG ) , 逐條生成指令 :


SaTbS \to aTb 對應的指令 : ε,SaTb\varepsilon , S \to aTb , 讀取 ε\varepsilon 時 , 使用 aTbaTb 替換棧頂的 SS ; 即如果棧頂是 SS , 使用 aTbaTb 替換棧頂的 SS ;

SbS \to b 對應的指令 : ε,Sb\varepsilon , S \to b , 讀取 ε\varepsilon 時 , 使用 bb 替換棧頂的 SS ; 即如果棧頂是 SS , 使用 bb 替換棧頂的 SS ;

TTaT \to Ta 對應的指令 : ε,TTa\varepsilon , T \to Ta , 讀取 ε\varepsilon 時 , 使用 TaTa 替換棧頂的 TT ; 即如果棧頂是 TT , 使用 TaTa 替換棧頂的 TT ;

TεT \to \varepsilon 對應的指令 : ε,Tε\varepsilon , T \to \varepsilon , 讀取 ε\varepsilon 時 , 使用 ε\varepsilon 替換棧頂的 TT ; 即如果棧頂是 TT , 使用 ε\varepsilon 替換棧頂的 TT ;

如果棧上有終端字符 aa , 要將棧裏的終端字符 aa 移除 , 對應指令是 a,aεa , a \to \varepsilon , 如果讀取到字符 aa 時 , 從棧頂將字符 aa 移除 ;

如果棧上有終端字符 bb , 要將棧裏的終端字符 bb 移除 , 對應指令是 b,bεb , b \to \varepsilon , 如果讀取到字符 bb 時 , 從棧頂將字符 bb 移除 ;

在這裏插入圖片描述





V . 下推自動機 ( PDA ) qacceptq_{accept} 狀態



1 . qacceptq_{accept} 狀態 :


qloopq_{loop} 狀態下 , 將棧內的除 KK 外所有的字符都移除完畢 , 開始向 qacceptq_{accept} 狀態跳轉 ;

此時需要生成指令 ε,Kε\varepsilon , K \to \varepsilon , 讀取 空字符 ε\varepsilon , 使用 空字符 ε\varepsilon 替換棧頂的 KK 字符 , 此時棧清空了 ;

在這裏插入圖片描述





VI . 下推自動機 ( PDA ) 指令分解



1 . 非法指令分解


上述生成的

  • ε,SaTb\varepsilon , S \to aTb
  • ε,TTa\varepsilon , T \to Ta

兩個指令是不合法的 , 在棧中 , 一個字符 ( 或空字符串 ε\varepsilon ) 只能由 一個字符 ( 或空字符串 ε\varepsilon ) 替換 ;


上述不合法的規則 , 多個字符替換棧頂的一個字符 , 需要進行分解操作 ;



2 . ε,SaTb\varepsilon , S \to aTb 指令分解流程 :


qloopq_{loop} 狀態 跳轉到 新的狀態 qloop1q_{loop1} , 跳轉讀取的指令時 ε,Sb\varepsilon , S \to b , 讀取空字符 , 然後使用 bb 替換棧頂的 SS 字符 ;

在這裏插入圖片描述


qloop1q_{loop1} 狀態 跳轉到 新的狀態 qloop2q_{loop2} , 跳轉讀取的指令時 ε,εT\varepsilon , \varepsilon \to T , 讀取空字符 , 然後使用 TT 替換棧頂的 ε\varepsilon 字符 , 相當於在棧中放入了 TT 字符 ;

在這裏插入圖片描述

qloop2q_{loop2} 狀態 跳轉到 原來的狀態 qloopq_{loop} , 跳轉讀取的指令時 ε,εa\varepsilon , \varepsilon \to a , 讀取空字符 , 然後使用 aa 替換棧頂的 ε\varepsilon 字符 , 相當於在棧中放入了 aa 字符 ;

在這裏插入圖片描述


分解 ε,SaTb\varepsilon , S \to aTb 後的 33 個指令 :

  • ε,Sb\varepsilon , S \to b
  • ε,εT\varepsilon , \varepsilon \to T
  • ε,εa\varepsilon , \varepsilon \to a

上述三個指令都是合法的 , 上述 33 個指令 串聯後的效果等價於 ε,SaTb\varepsilon , S \to aTb 操作 , 等價於上下文無關語法的 SaTbS \to aTb 規則效果 ;



3 . ε,TTa\varepsilon , T \to Ta 指令分解流程 :


qloopq_{loop} 狀態 跳轉到 新的狀態 qloop3q_{loop3} , 跳轉讀取的指令時 ε,Sa\varepsilon , S \to a , 讀取空字符 , 然後使用 aa 替換棧頂的 SS 字符 ;

在這裏插入圖片描述

qloop3q_{loop3} 狀態 跳轉到 原來的狀態 qloopq_{loop} , 跳轉讀取的指令時 ε,εT\varepsilon , \varepsilon \to T , 讀取空字符 , 然後使用 TT 替換棧頂的 ε\varepsilon 字符 , 相當於在棧中放入了 TT 字符 ;

在這裏插入圖片描述


分解 ε,TTa\varepsilon , T \to Ta 後的 22 個指令 :

  • ε,Sa\varepsilon , S \to a
  • ε,εT\varepsilon , \varepsilon \to T

上述 22 個指令都是合法的 , 上述 22 個指令 串聯後的效果等價於 ε,TTa\varepsilon , T \to Ta 指令 , 等價於上下文無關語法的 TTaT \to Ta 規則效果 ;





VII . 最終轉換成的 下推自動機 ( PDA ) 結果



最終的 上下文無關語法 ( CFG ) 轉爲的 下推自動機 ( PDA ) 樣式 :

在這裏插入圖片描述

上下文無關語法 ( CFG ) 與 下推自動機 ( PDA ) 是等價的 , 給定一個 下推自動機 ( PDA ) , 構造 上下文無關語法 ( CFG ) , 該語法生成的語言 , 就是該 下推自動機 ( PDA ) 所認識的語言 ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章