2

我正在嘗試將給定cfg後的表達式的語法指導翻譯的語義規則寫入3代碼表示中。語法指導翻譯

考慮,

enter image description here

這裏,爲什麼||操作員需要? gen()是唯一需要的東西,因爲它需要做什麼。

+1

對我而言,'||'似乎在這個上下文中作爲語句分隔符(而不是運算符)。 –

+0

@ 500-InternalServerError反正爲什麼要放E.code。 ||看起來像串接。 – Novak007

+2

@ 500-InternalServerError:它不是語句分隔符。閱讀我的答案。 –

回答

4

這組規則描述了屬性語法,用於計算樹的屬性的方案。這樣的方案几乎總是純粹的功能(無副作用)。它是在每個規則/樹節點計算屬性,在他們正在使用的符號中命名爲XY,其中X代表規則/樹(例如,帶有變體E1和E2的S和E,Y代表計算屬性(在這種情況下,有「代碼」和「地點」屬性

每個規則對應一個子樹,E = E1 + E2到S-表達式中的樹(E + E1 E2)。 「表示計算」...「並將結果賦值給」E(+)「樹根(」合成「屬性)的屬性」代碼「;」E1.code:= ...「表示計算」 ...「並分配給」E1「葉(」繼承的屬性「)。不在分配的左側的」XY「意味着」獲取節點X上的屬性Y的值「

計算使用的是「newtemp」(這應該是「newtemp()」 ,因爲它不是一個變量,而是一個函數),「gen(...)」和「||」。 「創」顯然是在製造個別指令的關鍵工作。 但是它是什麼結果?一個簡單的答案就是「一串」;更復雜的答案可能是生成的指令的二進制表示。

「||」將代碼生成步驟的結果彙編成生成代碼的;如果gen結果是一個字符串,那麼「||」可以是字符串連接,如果結果是二進制記錄,則它將二進制記錄列表連接到單個列表中。

你可能會覺得「gen」只是簡單地產生了結果並且給他們寫了一個未提及的輸出流而感到困惑。這違反了屬性語法的精神,而不允許這樣做。 「||」運算符需要計算傳遞給樹的功能結果。

您可能會彎曲屬性語法,因此請將代碼寫入到隱藏流中。在這種情況下,所有的「||」運營商就會消失,就像提到以前計算的結果,如「E1.code」一樣。如果您的屬性樹評估是從左到右(大),那麼生成的子樹被組合以產生結果流的順序在完全從左到右完成時是正確的。如果屬性語法表示「E.code = E2.code || E1.code || gen(...)」,即它重新排序生成的代碼,那麼隱藏的輸出流技巧將不起作用。

採取不同的觀點:假設您想在大型程序中快速評估此屬性語法。如果你堅持一個純粹的功能語法,那麼你可以並行評估的所有屬性!你使用一個遞歸過程,爲每個孩子分配助手粒。 [聲音瘋了嗎?事實並非如此,我有一個屬性評估系統(參見我的生物)完全按照這個原理工作]。隱藏的輸出流在這種情況下也不起作用,因爲並行可能導致兒童以任何順序被訪問。