上下文無關語言:化簡與正規形式

不可達符號(unreachable symbol)

想像伺服器上存在一個網頁,但站內任何地方都沒有連結指向它,而你也無法輸入它的網址,因為你根本不知道。這個網頁本身沒問題,但從首頁出發的訪客永遠到不了它。不可達符號就是處於這種位置的文法變數:從起始符號出發,沒有任何推導能讓它現身。

形式上,若存在某個推導 S =>* alpha X beta(對某些字串 alpha 與 beta),亦即 X 出現在某個由起始符號 S 可推導出的句型中,則符號 X 是可達的。不可達符號就是不出現在任何這種句型中的符號。你用從 S 出發的圖搜尋找出可達符號:標記 S 可達;每當一個可達變數 A 有規則 A -> alpha,就把 alpha 中的每個符號標記為可達;重複直到沒有新東西被標記。剩下未標記的就是不可達,它(連同其規則)可以刪除而不改變語言。

不可達符號的移除在非生成符號移除之後進行,而這個順序不可隨意。刪掉一個非生成變數,可能切斷通往某個其他變數的唯一路徑,使它變成新的不可達;所以先處理生成,再處理可達。注意相反的陷阱:若你先移除不可達符號再移除非生成符號,刪掉一個非生成符號又可能使某變數變成孤兒,留下殘渣。把順序弄對,各做一次就夠了。

S -> aS | b, A -> cA | c。從 S 搜尋只到達 S、a、b。變數 A(與終端符號 c)從不出現在任何由 S 可推導的句型中,所以 A 不可達:刪除 A -> cA | c。語言 {a^n b} 不變。

可達性是從起始符號出發的圖搜尋;它從未造訪的東西都可刪除。

先移除非生成符號,再移除不可達符號。反過來的順序可能留下無用符號,因為刪掉一個非生成變數可能使其他變數變成新的孤兒。

又称
inaccessible symbolunreachable variablenon-reachable nonterminal不可及符號無法到達的變數