什麼是語法樹?


其中每個葉子節點描述一個運算元,每個內部節點描述一個運算子。語法樹是語法分析樹的簡寫形式。

示例 1 - 為字串 a + b ∗ c − d 繪製語法樹。

構建語法樹的規則

語法樹中的每個節點都可以作為具有多個欄位的資料執行。在運算子的節點中,一個欄位識別運算子,其餘欄位包含指向運算元節點的指標。運算子稱為節點的標籤。以下函式用於為具有二元運算子的表示式建立語法樹的節點。每個函式都返回指向最近生成的節點的指標。

  • mknode (op, left, right) - 它生成一個帶有標籤 op 的運算子節點,以及兩個包含指向左節點和右節點的指標的欄位。

  • mkleaf (id, entry) - 它生成一個帶有標籤 id 的識別符號節點,以及包含 entry 的欄位,entry 是指向識別符號符號表條目的指標。

  • mkleaf (num, val) - 它生成一個帶有標籤 num 的數字節點,以及包含 val 的欄位,val 是數字的值。例如,為表示式 a − 4 + c 構建語法樹。在這個序列中,p1、p2、……p5分別是指向識別符號 'a' 和 'c' 的符號表條目的指標。

p1− mkleaf (id, entry a);
p2− mkleaf (num, 4);
p3− mknode ( ′−′, p1, p2)
p4− mkleaf(id, entry c)
p5− mknode(′+′, p3, p4);

樹以自底向上的方式生成。函式呼叫 mkleaf (id, entry a) 和 mkleaf (num 4) 為 a 和 4 構造葉子節點。指向這些節點的指標使用 p1 和 p2 儲存。然後,呼叫 mknodes (′−′, p1, p2 ) 建立內部節點,其中 a 和 4 的葉子作為子節點。語法樹將是

語法樹的語法制導翻譯

產生式語義動作
E → E(1) + E(2){E. VAL = Node (+, E(1). VAL, E(2). VAL)}
E → E(1) ∗ E(2){E. VAL = Node (∗, E(1). VAL, E(2). VAL)})
E → (E(1)){E. VAL = E(1). VAL}
E → E(1){E. VAL = UNARY (−, E(1). VAL}
E → id{E. VAL = Leaf (id)}

Node (+, 𝐄(𝟏), 𝐕𝐀𝐋, 𝐄(𝟐). 𝐕𝐀𝐋) 將建立一個標記為 + 的節點。

E(1). VAL &E(2). VAL 是該節點的左子節點和右子節點。

類似地,Node (∗, E(1). VAL, E(2). VAL) 將使語法為 −

函式 UNARY (−, E(1). VAL) 將建立一個節點 –(一元減號),並且 E(1). VAL 將是其唯一的子節點。

函式 LEAF (id) 將建立一個帶有標籤 id 的葉子節點。

示例 2 - 為表示式構建語法樹。

a = b ∗ −c + d

解決方案

示例 3 - 為語句構建語法樹。

如果 a = b 則 b = 2 * c

解決方案

示例 4 - 考慮以下程式碼。繪製其語法樹

如果 x > 0 則 x = 2 * (a + 1) 否則 x = x + 1。

示例 5 - 為以下算術表示式 a * (b + c) – d /2 繪製語法樹。此外,將給定表示式寫成字尾形式。

字尾表示法

a b c + * d 2 / -

更新於: 2023 年 10 月 26 日

26K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.