1. 程式人生 > >ANTLR4權威參考手冊(一)

ANTLR4權威參考手冊(一)

寫在前面的話:

此文件是對偉大的Terence Parr的著作《the definitive antlr4 reference》的翻譯本,致敬!歡迎轉載,請註明原地址,請尊重勞動成果。翻譯有誤的地方,歡迎指正。

歡迎進入ANTLR的世界!

ANTLR V4是一款您可以用來閱讀,處理,執行,或轉化成結構化的文字或二進位制檔案的強大的解析生成器。它在學術界和工業界被廣泛地用來建立各種語言,工具和框架。推特搜尋使用ANTLR的查詢解析,一天超過2,000,000,000多個查詢。HivePig,資料倉庫以及hadoop的分析系統的語言都是用了ANTLRLex MachinaANTLR從合乎規則的文字中進行資訊抽取。

OracleSQL developer ide 及其遷移工具中用到了ANTLRNetBeans IDEANTLR解析C++HibernateHQL語言用ANTLR搭建OR對映框架。

除了這些大牌,高知名度的專案,你可以建立各種有用的工具,如配置檔案的讀取,遺留程式碼轉換器,Wiki標記的渲染器以及JSON解析器。我為關係資料庫對映建立的一些小工具,描述3D虛擬,並注入分析程式碼轉換為Java原始碼,我甚至為演講做了一個簡單的DNA模式匹配的例子。

通過語法的語言描述,ANTLR可以生成這種語言解析器並自動生成解析樹(一種代表語法如何去匹配輸入的的資料結構)。ANTLR也可自動生成樹的

walkers,你可以訪問那些樹的節點來執行應用程式特定的程式碼。

這本書是為ANTLR4版本作為參考,同時也用它來解決語言識別問題的一個指導。你將學習如何做如下的事情:

從給出的例子中和參考手冊中去識別語法的語言模式,學以致用。最終達到建立自己語法的要求。

從簡單的語言(如JSON)一直到複雜的程式語言(像R語言)慢慢去構建語法,你將會解決PythonXML一些棘手的識別問題。

基於那些語法通過walking自動生成的解析樹來實現語言應用。

為特定應用領域自定義識別錯誤處理方法和錯誤報告。

通過在語法中嵌入Java程式碼實現對解析的絕對控制。

與教科書的偏理論不同,本書以案例驅動的討論是為了使內容更加具體形象,方便你為建立自己的語言應用提供一些工具集。

這本書是為誰寫的

這本書是專門針對有興趣學習如何建立資料的讀取器,語言解釋與轉換的程式設計師們。這本書的內容就是如何用ANTLR去構建這些事情,當然,但你一般要了解詞法分析器和解析器的知識。初學者和專家都需要用這本書來高效地使用ANTLR V4。在你看到第三部分高階主題的內容之前,你最好通過看前面幾章來獲得關於ANTLR的一些經驗。讀者也應該瞭解一些Java方面的知識。

ANTLR V4為什麼這麼酷

ANTLRV4版本有一些重要的新功能,可以讓學習少走一些彎路,使開發語法和語言應用更加容易。最重要的一點是,ANTLR V4欣然接受你定義的每一個語法(對於間接左遞迴來說是例外)。ANTLR在翻譯你的語法成為可執行檔案、可讀分析的程式碼的時候是沒有語法衝突或出現模糊警告的情況。

如果你給你的ANTLR生成的解析器一個有效輸入,無論多麼複雜的語法,解析器都將正確識別。當然,這首先依賴於你確保語法對問題是準確的描述。

ANTLR解析器使用了我跟Sam Harwell開發的一個全新的解析技術,稱為Adaptive LL(*)或者說是ALL(*)ALL*)是V3LL*)技術的一個擴充套件,在生成的解析器執行之前,動態地完成語法分析而不是之前的靜態分析。因為ALL*)解析器獲取實際的輸入序列,他們總是能想出如何通過適當地編織語法去識別序列。而相比靜態分析,必須考慮到所有可能的(無限長)輸入序列。

實際上,使用ALL*)意味著你不必扭曲你的文法去迎合其他大多數解析器生成器工具的基本分析策略,包括ANTLR V3。如果你曾經為ANTLR V3的模糊警告或在yacc中的一個降低或者減少的衝突而傷透腦筋的話,那麼ANTLR V4正是你想要的!

小知識:yaccYet AnotherCompiler Compiler,Unix/Linux上一個用來生成編譯器的編譯器(編譯器程式碼生成器)。yacc生成的編譯器主要是用C語言寫成的語法解析器(Parser),需要與詞法解析器Lex一起使用,再把兩部份產生出來的C程式一併編譯。 yacc本來只在Unix系統上才有,但現時已普遍移植往Windows及其他平臺。

下一個新特點,ANTLR V4大大簡化了用於匹配的語法結構的語法規則,比如像程式語言算術表示式。表示式需要用ANTLR文法(用遞迴下降分析器去手動識別)來指定已然成了一件麻煩的事情。識別表示式的最自然的語法對像ANTLR V3這樣傳統的自上而下的分析器生成器來說是無效的。現在,用antlr V4,你可以用如下這樣的規則去匹配表示式:

expr : expr'*' expr   // match subexpressions joined with '*'operator

| expr'+' expr       // match subexpressions joined with '+' operator

| INT             // matches simple integer atom

;

expr這樣的自引用的規則就是遞迴,特別是,左遞迴因為在其選擇至少一個立即指向本身。

ANTLR V4自動重寫了左遞迴規則,如把expr變成一個非左遞迴等價物。唯一的限制是,左遞迴在規則引用自己必須是直接的。不可能指向於另一個可替代規則方案。

除了這兩個語法相關的改進,使ANTLR V4構建語言應用程式更容易。ANTLR生成的解析器自動建立輸入的方便表示,稱為解析樹,這樣應用程式可以根據自己的興趣去遍歷觸發程式碼片段。此前,V3使用者不得不增加施工作業的語法樹。除了自動構建樹,ANTLR V4還可以在listenervisitor模式實現中自動生成解析樹的遍歷器。 listener類似於XML文件處理XML解析器觸發的SAX事件的響應物件。

ANTLR V4學習容易得多,因為那些新功能是不能從V3繼承的。

最大的變化是,V4不再強調在語法中中嵌入的動作(程式碼),取而代之的是listenervisitor。方便從應用程式程式碼中解耦語法。沒有嵌入的動作,你也可以在不同的應用程式複用同樣的語法而不用重新編譯生成語法分析器。ANTLR仍然允許嵌入的動作,但這樣做是V4的高階應用。這樣的行為需要控制的最高水平,並且是以失去語法複用成本為代價的。

因為ANTLR自動生成語法分析樹和樹的遍歷器,你不需要在V4建立樹文法。你可以使用visitor這樣熟悉的設計模式代替。這意味著,一旦你已經學會了ANTLR語法,你可以回到舒適和熟悉的Java程式語言領域去實現實際的語言應用。

• ANTLR V3LL*)分析策略是弱於V4ALL*),所以V3有時依靠回溯法來正確解析輸入短語。回溯很難通過生成的解析器去除錯文法因為解析器解析相同的輸入可能會出現多次(由於遞迴的存在)。而且回溯對解析器遇到無效輸入時很難反饋滿意的錯誤資訊。

ANTLR V4,是我在讀研究生時繞的一個小彎的成果,一晃都有二十五年了。我想我要改變我的座右銘咯。

Why program by hand in fivedays what you can spend twenty-five years of your life automating?

由於ANTLR V4的正是我追求的一個解析器生成器,這個問題,本來想在上世紀80年代就解決的,25年來我最終如願。現在,那些時光已近模糊。

這本書講了什麼

本書分為四個部分。

    第一部分介紹了ANTLR,提供了一些語言背景知識,並且帶你開始一場ANTLR的效能之旅。你會初嘗語法的滋味,知道用它能做些什麼。

    第二部分是通過提供的語法和樹遍歷器的組合使用,來進行語法設計、構建語言應用。

    第三部分開始向你展示如何自定義分析器的錯誤處理。接下來,您將學習如何在語法中嵌入動作,因為有時候它比在構建樹並去遍歷要簡單和更有效的多。相關的動作,你也會學到如何使用語義predicatesto去改變分析器行為來處理一些具有挑戰性的識別問題。最後一章解決了一些具有挑戰性的語言識別問題,如Python XML和上下文敏感的換行符識別。

    第四部分是參考部分,並列出了ANTLR語法的元語言和執行依賴庫的使用規則。

listener子目錄下的t.properties

listeners/t.properties

user="parrt"

machine="maniac"

更多關於ANTLR線上學習

http://www.antlr.org網站上,你會發現ANTLR的下載介面,ANTLRWorks2圖形使用者介面(GUI)的開發環境,文件,預建的文法,例項,文章,和檔案共享區。技術支援郵件列表是對新手來說是非常有好處的。

Terence Parr

舊金山大學, 2012 11