編譯器設計中的優先順序函式是什麼?
優先順序表中任意兩個運算子或符號之間的優先順序關係可以轉換為兩個將終結符對映到整數的優先順序函式 f 和 g。
- 如果 a <. b,則 f (a) <. g (b)
- 如果 a = b,則 f (a) =. g (b)
- 如果 a .> b,則 f (a) .> g (b)
這裡 a、b 表示終結符。f (a) 和 g (b) 表示具有整數值的優先順序函式。
優先順序函式的計算
- 對於每個終結符 a,建立符號 fa 和 ga。
- 為每個符號建立一個節點。
如果 a =. b,則 fa 和 gb 在同一組或節點中。
如果 a =. b 和 c =. b,則 fa 和 fc 必須在同一組或節點中。
- (a) 如果 a <. b,則從 gb 到 fa 畫一條邊。
(b) 如果 a .>b,則從 fa 到 gb 畫一條邊。
- 如果構造的圖具有迴圈,則不存在優先順序函式。
- 如果沒有迴圈。
(a) fa = 從 fa 組開始的最長路徑的長度。
(b) ga = 從 ga 組開始的最長路徑的長度。
示例 1 - 為下表構建優先順序圖和優先順序函式。
解決方案
步驟 1 - 建立符號
步驟 2 - 從給定表中可以看出,沒有符號具有相同的優先順序;因此,每個符號將保留在不同的節點中。
步驟 3 - 如果 a <. b,則從 fa → ga 建立一條邊
如果 a .>b,則從 gb → fa 建立一條邊
由於 $ <. +,*, id。因此,從 g+、g*、gid 到 fs 畫一條邊
類似地 + <. ,∗, id。∴ 從 g*、gid 到 f+ 畫一條邊
類似地 * <. id。因此,從 gid 到 f* 畫一條邊。
由於 +,*, id . > $ 因此,從 f+、f*、fid 到 gs 畫一條邊。
類似地 +,*, id . > +。從 f+、f*、fid 到 g+ 畫一條邊。
類似地 *, id . > *。從 f*、fid 到 g 畫一條邊。
組合所有邊,我們得到
步驟 4 - 計算每個節點路徑的最大長度,我們得到以下優先順序函式
Id | + | * | $ | |
F | 4 | 2 | 4 | 0 |
G | 5 | 1 | 3 | 0 |
示例 2 - 為下表構建優先順序圖和優先順序函式。
解決方案
由於我們有 (=.)。因此 f 和 g 將在同一組中。
優先順序圖的計算
優先順序函式表的計算
由於 f$ 和 g$ 沒有輸出邊,因此 f($ ) = g($ ) = 0。
由於 f 和 g 沒有輸出邊,因此 f(( ) = g( )) = 0。
對於所有其他情況,計算從其開始的最長路徑。
例如 -
取 f+,
它有三條輸出邊並追蹤其路徑。
f+ → g$
f+ → f(
f+ → g+ → f( 和 f+ → g+ → f$
選擇最大長度的路徑,長度為 2。
因此,f+ = 2。計算 f 和 g 的所有路徑,我們得到優先順序表
+ | * | ( | ) | id | $ | |
F | 2 | 4 | 0 | 4 | 4 | 0 |
G | 1 | 3 | 5 | 0 | 5 | 0 |