學習背景
最近做項目需要開發(fā)一個類似Graphql的簡單版的自定義查詢功能。
功能主要是通過前端自定義的復查詢條件來控制后端的查詢字段以及最終返回的JSON格式。
最初準備直接使用Graphql實現但是研究后發(fā)現Graphql還是比較重迂求,需要重新定義對象關系來配置Graphql的描述文件。最終決定參照Graphql的查詢條件結構來自定義符合需求的查詢。研究了Graphql的底層后發(fā)現是用ANTLR來做的語法解析密似。
開始了解ANTLR這個技術,結果一接觸感覺發(fā)現了新大陸葫盼。覺得很有比較寫個筆記記錄一下残腌。
ANTLR簡介
ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法實現的語法解析器生成器(parser generator),用Java語言編寫,使用自上而下(top-down)的遞歸下降LL剖析器方法抛猫。由舊金山大學的Terence Parr博士等人于1989年開始發(fā)展蟆盹。
如同一般的詞法分析器(lexer)和語法分析器(parser),ANTLR可以用來產生樹狀分析器(tree parsers)闺金。ANTLR 文法定義使用類似EBNF(Extended Backus-Naur Form)的定義方式逾滥,形象十分簡潔直觀。例如: ANTLR用A : a;來表示規(guī)則败匹,舊式的方法則是以 A=>a 表示寨昙,所以ANTLR是以“:”代替了“=>”。ANTLR的規(guī)則要以分號“;”結束掀亩。又如其他ANTLR符號“|”代表“或”的關系舔哪,又如“*,+”表示可以出現0次或多次槽棍。
目前Hibernate與WebLogic都是使用ANTLR做為來解析HQL尸红。在NetBeans IDE中更以ANTLR解析C++。Twitter搜索使用ANTLR解析刹泄,一天超過200億次查詢外里。
是什么
簡單來說ANTLR是一個可以開發(fā)自動工具的工具,使用ANTLR可以定義自己的“程序語言”特石。
不管你使用的是什么開發(fā)語言甚牲, 大家都知道所謂的代碼其實就是定義好的一些有具體含義的語句磷仰,但在最終運行在計算機上其實都機器語言瓢姻。
把程序員寫的代碼解釋為機器語言翅敌,這里必不可少的都有一個語法解釋器。ANTLR就是一個可以幫助你編寫一個語法解釋器的技術逞敷。 還有的時候狂秦,我們需要將一個語法翻譯為另外一個語言,這時候需要一個語法翻譯器推捐, ANTLR也可以幫你實現裂问。
在接觸到ANTLR后,發(fā)現可以填補上之前知識點欠缺的一塊牛柒。理解了語法解釋器和語法翻譯器后堪簿,是不是很容易理解一些代碼生成器,代碼翻譯器的實現原理皮壁。 之前接觸過的很多技術底層可能都能看到ANTLR的影子椭更。
能做什么
已目前對ANTLR的了解,它能做的事情真的很多蛾魄,稍微梳理一些我的思路虑瀑。
-
語言翻譯器
開發(fā)一個把JAVA代碼翻譯成Python的工具
-
自定義一種數據交換格式
開發(fā)一個類似json的格式湿滓,這正是我上面的需求中需要的
做代碼分析的工具
寫一個工具來進行代碼規(guī)范的檢查,快速檢查項目不符合編碼規(guī)范的代碼快速重構項目代碼
ANTLR可以重寫輸入流舌狗,在項目中需要做一些重構時叽奥,寫一個快速自動重構的工具
我相信ANTLR能做的事情還很多,發(fā)揮一下腦洞把夸, 是不是可以基于JAVA開發(fā)一種自己的程序語言,把自己定義的語法翻譯成JAVA最終在JVM中執(zhí)行铭污。
學習路徑
前面都ANTLR做了一下介紹恋日,后面會詳細介紹在學習ANTLR過程中的一些筆記。目前學習主要參考的資料是《ANTLR4權威指南》這本書嘹狞。
后面會逐步介紹ANTLR的使用方法以及一些簡單的案例學習岂膳。