上下文無關語言:化簡與正規形式
非生成符號(non-generating symbol)
想像一台販賣機的按鈕,每次你按下去,它只會給你更多按鈕去按,從不給真正的零食。無論你按多久,永遠拿不到食物。非生成符號就像那個按鈕的文法變數:它永遠無法落到一個完成的終端符號字串。
形式上,若存在某個推導 A =>* w,其中 w 是只由終端符號組成的字串(可能是空字串),則變數 A 是生成的。非生成符號就是不存在這種推導的變數——它的每條規則都不斷產生那些自己也永遠無法完成的變數。你用一個簡單的由下而上標記法找出生成符號:先標記每個終端符號,以及任何具有規則 A -> w(其中 w 已全為生成)的變數(例如 A -> a);然後重複,標記任何具有一條右側現已全為生成的規則的變數,直到沒有新東西被標記為止。剩下未被標記的就是非生成的。
非生成符號及提到它們的規則會在無用符號移除中被刪除,關鍵是這要在不可達符號的處理之前做。若刪除非生成符號後,起始符號本身也沒了(非生成),則文法的語言為空集——這其實正是判定上下文無關文法空性問題的方法。這個標記程序的執行時間是文法大小的多項式,所以偵測非生成符號很便宜。
S -> AB | a, A -> aA, B -> bB。標記:終端符號 a、b 是生成的;S 透過 S -> a 是生成的。但 A 只有 A -> aA(右側提到 A,永遠不會全是終端),B 只有 B -> bB,所以 A 與 B 都永遠不會被標記——兩者皆非生成,而 S -> AB 是死規則。
一個變數唯有在某條規則能讓它最終到達全終端字串時,才是生成的。
非生成跟不可達不是同一回事。一個符號可能從起始符號完全可達,卻仍是非生成的(你到得了它,但它走入死路);這兩種測試彼此獨立,缺一不可。
又称
另见