上下文無關文法與推導

剖析樹(parse tree)

推導是一段冗長、逐步的口述,講述字串如何被建造;剖析樹則是把這一切一次捕捉下來的圖像。它是一張樹形圖,其形狀顯示各片段如何彼此巢狀——是字串的結構骨架。推導以某種順序列出各步動作,樹則丟棄無關緊要的順序,只保留結構。

形式上,上下文無關文法的剖析樹是一棵樹:根標記為起始符號,每個內部節點標記為一個變數,而標記為 A 的節點之子節點由左到右讀出,恰好拼出某條用來展開 A 的產生式規則 A → α 的右側。葉節點標記為終端符號(空產生式則標記為 ε)。由左到右讀出葉節點,便得到所生成的字串,稱為樹的「果實(yield)」。所以每個內部節點是一條規則的一次套用,而整棵樹記錄了整個推導,與規則套用的順序無關。

深刻的回報在於樹與推導的關係:一棵剖析樹對應「許多」推導(獨立重寫的所有排序),但恰好對應「一個」最左推導與恰好「一個」最右推導。這就是為何剖析樹、而非推導序列,才是字串結構的誠實概念——也是為何歧義以樹來定義:當某字串有兩棵不同的剖析樹時,文法就是歧義的,意指兩種真正不同的結構。當心「不同推導=不同結構」這個錯誤等式;同一棵樹的兩個推導只在記帳順序上不同。

對 E → E + E | E * E | a,字串 a + a * a 有「兩棵」剖析樹:一棵以 + 為根(a + (a*a)),一棵以 * 為根((a+a) * a)。兩棵樹的果實都是同一字串 a + a * a,卻描繪出不同的分組。

節點的子節點拼出某規則的右側;葉節點由左到右即果實。一個字串對應兩棵樹 = 歧義。

一棵剖析樹對應許多推導,但恰好對應一個最左(與一個最右)推導。兩個不同的推導「不」蘊含兩種結構——只有兩棵不同的剖析樹才是。

又称
derivation treesyntax treeconcrete syntax tree語法樹推導樹