ε-產生式(epsilon-production)
/ epsilon: EP-sih-lon /
有些字可以消失而不破壞句子:在「我(不)喜歡它」裡,括號中的部分是可有可無的。ε-產生式是一條讓變數完全消失、對最終字串毫無貢獻的文法規則。它是文法表達「這部分可以不存在」的方式。
形式上,ε-產生式是形如 A -> epsilon 的規則,其中 epsilon(寫作 ε)是空字串,即長度為零的字串。在推導中套用這種規則時,變數 A 被替換成完全沒有東西。例如用 S -> aSb | epsilon,你可以這樣推導出 aabb:S => aSb => aaSbb => aabb,最後一步用 S -> epsilon 刪掉內層的 S。沒有那條 ε-規則,這個文法永遠停不下來、產生不出有限字串。ε-產生式正是文法表達「可有可無」或「空」片段的手段。
ε-產生式對寫文法很有用,但它妨礙正規形式與某些剖析方法,因為一個能消失的變數使人難以預測推導會消耗多少符號。因此一個標準的清理步驟就是在保持語言不變的前提下移除它們。一個微妙之處:若空字串 ε 本身屬於該語言(起始符號可推導出 epsilon),你無法消除這個事實;慣常的做法是只在起始符號上允許剛好一條 ε-產生式 S -> epsilon,而在其他任何地方禁止 epsilon。
在 S -> AbA, A -> a | epsilon 中,變數 A 可以變成「a」或消失。因此它產生「aba」「ab」「ba」「b」——兩個 A 位置各自獨立地出現或為空。
ε-產生式讓某片段可有可無:A -> epsilon 表示 A 可以缺席。
別把空字串 epsilon(長度為零的字串,它仍是一個字串)和空語言(完全不含任何字串的集合)混為一談。A -> epsilon 加入的是空字串;這跟 A 沒有任何規則並不相同。