鸚鵡虛擬機器/高階 PGE
本章中的資訊可能會在建立關於 Perl 6 的書籍時得到更詳細的介紹 |
我們已經瞭解了使用 PGE 和 NQP 進行解析器構建的一些基礎知識。在本章中,我們將更深入地瞭解我們尚未見過的語法引擎的一些功能。一些更高階的功能,例如內聯 PIR 程式碼、斷言、函式呼叫和內建標記型別,將使編譯器設計者的生活更加輕鬆,但對於大多數基本任務來說是不必要的。
PGE 是 Perl 6 語法規則引擎 的實現,最終將在 Parrot 上的 Perl6 實現“Rakudo”中直接使用。Perl 6 語法規則規範豐富多樣,涵蓋它的所有方面超出了本書的範圍。我們將介紹 PGE 的基礎知識以及它對構建編譯器最有用的部分,但我們不可能涵蓋它所有高階細節。 |
正則表示式 是一種允許回溯的高階匹配操作。標記 是一種不允許回溯的低階匹配操作。原型 像正則表示式,但允許多重排程。將原型宣告視為幾種函式可以匹配的原型或簽名。
PIR 可以直接嵌入到 PGE 語法檔案和 NQP 檔案中。這對於彌合 NQP 由於其侷限性而無法處理的一些差距非常重要。有時將一些主動處理插入語法也很有用,以便能夠以更智慧的方式指導解析器。
在 NQP 中,可以使用 PIR 語句內聯 PIR 程式碼,後跟一個 PIR 程式碼的引號字串。如果你覺得它看起來更好,這個引號字串可以採用類似 perl 的“qw< ... >”型別的引號形式。
在 PGE 中,可以使用雙大括號“{{ ... }}”插入內聯 PIR。進入 PIR 模式後,可以透過呼叫 $Px = find_global "$/"(其中 $Px 是任何有效的 PIR 暫存器,x 是一個數字)訪問當前匹配物件。
PGE 已經定義了某些規則的基本預設值,以幫助解析。但是,如果你不喜歡預設行為,可以將其重新定義為其他內容。
函式 或 子例程 是現代程式設計實踐中不可或缺的一部分。因此,對它們的 支援是 PAST 系統的一部分,並且相對容易實現。我們將首先介紹一些必要的背景資訊,然後討論如何將所有部分整合在一起以建立一個具有可用子例程的系統。
在 Parrot 中,控制流,尤其是子例程的返回操作,是作為特殊的控制異常實現的。為什麼它作為異常而不是作為基本的 .return() PIR 語句來實現有點複雜。許多語言允許巢狀詞法範圍,其中在“內部”範圍中定義的變數不能被“外部”範圍中的語句看到、訪問或修改。在大多數編譯器中,這種行為由編譯器直接強制執行,並且在程式碼轉換為彙編和機器語言時不可見。但是,PIR 就像 Parrot 系統的組合語言,在這個級別上無法隱藏任何東西。所有區域性變數對於整個子例程都是區域性的,並且不能侷限於子例程的單個部分。為了實現巢狀範圍,Parrot 而是使用巢狀子例程
可以使用“return”PAST.op 型別使函式返回值。返回值系統基於控制異常。如前所述,異常將控制流移動到稱為“異常處理程式”的指定位置。就返回異常而言,處理程式是原始函式呼叫後的程式碼。返回值(目前,return PAST 節點只允許單個返回值)作為異常資料項傳遞,並由控制異常處理程式檢索。
所有這些細節通常對程式設計師隱藏,你可以像預期的那樣對待 return PAST 節點。如果存在,你將一個返回值傳遞給 return PAST 節點。當前函式結束,其範圍被銷燬。控制流返回呼叫函式,並使函式的返回值可用。
可以使用 <FUNC( )> 格式從規則中呼叫函式。
使用 <. > 形式建立不捕獲其內容的匹配物件。
形如 <$ > 的規則(可以是字串或其他資料)將被轉換為正則表示式,然後執行。
形如 <[ ]> 的規則包含自定義字元類。帶有 <-[ ]> 的規則是補充字元類。
<?before>,<!before><?after>,<!after><?same>,<!same><.ws><?at()>,<!at()>
您可以指定一個部分匹配,它嘗試儘可能多地匹配並且從不失敗,使用 <* > 形式。
您可以使用 <~~ > 規則遞歸回到當前匹配規則的子規則。