ANTLR V4是一款您可以用來閱讀。處理,運行,或轉化成結構化的文本或二進制文件的強大的解析生成器。它在學術界和工業界被普遍地用來創建各類語言。工具和框架。推特搜索使用ANTLR的查詢解析,一天超過2,000,000,000多個查詢。Hive。Pig,數據倉庫以及hadoop的分析系統的語言都是用了ANTLR。Lex Machina用ANTLR從合乎規則的文本中進行信息抽取。數據庫
Oracle在SQL developer ide 及其遷移工具中用到了ANTLR。NetBeans IDE用ANTLR解析C++。Hibernate中HQL語言用ANTLR搭建OR映射框架。express
除了這些大牌,高知名度的項目。你可以創建各類實用的工具,如配置文件的讀取。遺留代碼轉換器,Wiki標記的渲染器以及JSON解析器。我爲關係數據庫映射建立的一些小工具,描寫敘述3D虛擬。並注入分析代碼轉換爲Java源碼,我甚至爲演講作了一個簡單的DNA模式匹配的樣例。編程
經過語法的語言描寫敘述,ANTLR可以生成這樣的語言解析器並本身主動生成解析樹(一種表明語法怎樣去匹配輸入的的數據結構)。設計模式
ANTLR也可本身主動生成樹的walkers。你可以訪問那些樹的節點來運行應用程序特定的代碼。數據結構
這本書是爲ANTLR第4版本號做爲參考,同一時候也用它來解決語言識別問題的一個指導。你將學習怎樣作例如如下的事情:框架
•從給出的樣例中和參考手冊中去識別語法的語言模式,學以至用。編程語言
終於達到創建本身語法的要求。ide
•從簡單的語言(如JSON)一直到複雜的編程語言(像R語言)慢慢去構建語法,你將會解決Python和XML一些棘手的識別問題。工具
•基於那些語法經過walking本身主動生成的解析樹來實現語言應用。oop
•爲特定應用領域本身定義識別錯誤處理方法和錯誤報告。
•經過在語法中嵌入Java代碼實現對解析的絕對控制。
與教科書的偏理論不一樣。本書以案例驅動的討論是爲了使內容更加詳細形象,方便你爲創建本身的語言應用提供一些工具集。
這本書是專門針對有興趣學習怎樣創建數據的讀取器,語言解釋與轉換的程序猿們。
這本書的內容就是怎樣用ANTLR去構建這些事情。固然,但你通常要了解詞法分析器和解析器的知識。
剛開始學習的人和專家都需要用這本書來高效地使用ANTLR V4。在你看到第三部分高級主題的內容以前,你最好經過看前面幾章來得到關於ANTLR的一些經驗。讀者也應該瞭解一些Java方面的知識。
ANTLR的V4版本號有一些重要的新功能,可以讓學習少走一些彎路,使開發語法和語言應用更加easy。最重要的一點是,ANTLR V4欣然接受你定義的每一個語法(對於間接左遞歸來講是例外)。ANTLR在翻譯你的語法成爲可運行文件、可讀分析的代碼的時候是沒有語法衝突或出現模糊警告的狀況。
假設你給你的ANTLR生成的解析器一個有效輸入,無論多麼複雜的語法,解析器都將正確識別。固然。這首先依賴於你確保語法對問題是準確的描寫敘述。
ANTLR解析器使用了我跟Sam Harwell開發的一個全新的解析技術,稱爲Adaptive LL(*)或者說是ALL(*)。
ALL(*)是V3的LL(*)技術的一個擴展,在生成的解析器運行以前,動態地完畢語法分析而不是以前的靜態分析。因爲ALL(*)解析器獲取實際的輸入序列,他們老是能想出怎樣經過適當地編織語法去識別序列。
而相比靜態分析,必須考慮到所有可能的(無限長)輸入序列。
實際上,使用ALL(*)意味着你沒必要扭曲你的文法去迎合其它大多數解析器生成器工具的基本分析策略,包含ANTLR V3。假設你之前爲ANTLR V3的模糊警告或在yacc中的一個下降或者下降的衝突而傷透腦筋的話。那麼ANTLR V4正是你想要的。
小知識:yacc,Yet 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構建語言應用程序更easy。
ANTLR生成的解析器本身主動創建輸入的方便表示。稱爲解析樹。這樣應用程序可以依據本身的興趣去遍歷觸發代碼片斷。此前,V3用戶不得不添加施工做業的語法樹。
除了本身主動構建樹,ANTLR V4還可以在listener和visitor模式實現中本身主動生成解析樹的遍歷器。 listener相似於XML文檔處理XML解析器觸發的SAX事件的響應對象。
ANTLR V4學習easy得多,因爲那些新功能是不能從V3繼承的。
•最大的變化是,V4再也不強調在語法中中嵌入的動做(代碼)。取而代之的是listener和visitor。方便從應用程序代碼中解耦語法。沒有嵌入的動做,你也可以在不一樣的應用程序複用相同的語法而不用又一次編譯生成語法分析器。ANTLR仍然贊成嵌入的動做,但這樣作是V4的高級應用。
這種行爲需要控制的最高水平,並且是以失去語法複用成本爲代價的。
•因爲ANTLR本身主動生成語法分析樹和樹的遍歷器,你不需要在V4創建樹文法。你可以使用visitor這樣熟悉的設計模式取代。
這意味着,一旦你已經學會了ANTLR語法。你可以回到溫馨和熟悉的Java編程語言領域去實現實際的語言應用。
• ANTLR V3的LL(*)分析策略是弱於V4的ALL(*)。因此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月