ANTLR

ANTLR（全名：ANother Tool for Language Recognition）是基於LL(*)算法實現的語法解析器生成器（parser generator），用Java語言編寫，使用自上而下（top-down）的遞歸下降LL剖析器方法。由舊金山大學的Terence Parr博士等人於1989年開始發展。
ANTLR最初叫做PCCTS，Purdue Compiler Construction Tool Set，是Terence Parr在普渡大學攻讀碩士學位時的創作，在Hank Dietz教授的指導下，開始研究構造自動化的分析器。1993年，Parr取得博士學位，並於同年發佈ANTLR 1.10版。最早的ANTLR只支持Java，直到ANTLR 3以後開始支持Ada95、C、C＃、JavaScript、Objective-C、Perl、Python、Ruby、C++和Standard ML。
如同一般的詞法分析器（lexer）和語法分析器（parser），ANTLR可以用來產生樹狀分析器（tree parsers）。ANTLR 文法定義使用類似EBNF（Extended Backus-Naur Form）的定義方式，形象十分簡潔直觀。例如: ANTLR用A : a;來表示規則，舊式的方法則是以 A=>a 表示，所以ANTLR是以“:”代替了“=>”。ANTLR的規則要以分號“;”結束。又如其他ANTLR符號“|”代表“或”的關係，又如“*，+”表示可以出現0次或多次。
ANTLR本身使用switch-case來匹配token，形成記號序列記號流，舊式的Yacc則利用符號表（parser table）。ANTLR是完全exception-driven，LL(k)語法比目前流行的LR剖析器（包含SLR, LALR等）強大，更可以避免LR剖析器既有的位移-歸約（shift-reduce）或歸約-歸約（reduce-reduce）之類的語法衝突，產生的代碼清楚易懂，便於程序員閱讀和理解。同時更支持Unicode。

**ANTLR v4**
早期Antlr的LL(*)文法仍不支持“左遞歸”（left-recursion），這是所有LL剖析器的侷限，在左遞歸過程沒有消耗掉任何token, LL剖析器很容易造成stack overflow。至於如何消除左遞歸問題，在ANTLR 3中會將parsing策略退化為LL(1) + 回溯的形式。ANTLRWorks則提供一些自動消除左遞歸的功能，但不實用。接下來的ANTLR v4大力支持Kleene Closure表示法，透過kleene star(*)和kleene cross(+)的語法糖（syntax sugar），直接以while語句取代遞歸，總算可以順利解決LL分析法所不允許的左遞歸（但仍不能應付間接左遞歸，比如兩條分支擁有共同的遞歸規則作為前綴），因此可兼容Yacc的文法。再者，ANTLR對於LL(*)不能正確分析的情況，還支持語義斷言（Semantic Predicate）來輔助判斷, Semantic Predicate可以是任何邏輯，只需返回bool值。
目前Hibernate與WebLogic都是使用ANTLR做為來解析HQL。在NetBeans IDE中更以ANTLR解析C++。Twitter搜索使用ANTLR解析，一天超過200億次查詢。
雖然ANTLR本身是免費的，但《The Definitive ANTLR Reference》這本參考書則屬於使用者付費。目前免費文件極少。

**用於何處**
下列為ANTLR的使用列表:- Groovy- Jython- Hibernate-  OpenJDK Compiler Grammar projectdate=20150225223231  experimental version of the javac compiler based upon a grammar written in ANTLR- Apex, Salesforce.com's programming language- The expression evaluator in Numbers, Apple's spreadsheet- Twitter's search query language- Weblogic server-  IntelliJ IDEAdate=20150217083919  and  Clion.date=20150217083917 - Apache Cassandra- Processing

**參見**
 JavaCC- SableCC- DMS Software Reengineering Toolkit- Coco/R- Modular Syntax Definition Formalism- Parboiled (Java)

**注釋**

**文獻**
 citation | first1=Terence | last1=Parr | date=May 17, 2007 | title=The Definitive Antlr Reference: Building Domain-Specific Languages | edition=1st | publisher=Pragmatic Bookshelf | pages=376 | isbn=0-9787392-5-6 | url=http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference | accessdate=2015-02-17 | archive-date=2016-04-03 | archive-url=https://web.archive.org/web/20160403181542/https://pragprog.com/titles/tpantlr/the-definitive-antlr-reference | dead-url=no - citation | first1=Terence | last1=Parr | date=December 2009 | title=Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages | edition=1st | publisher=Pragmatic Bookshelf | pages=374 | isbn=978-1-934356-45-6 | url=http://www.pragprog.com/titles/tpdsl/language-implementation-patterns | accessdate=2015-02-17 | archive-date=2016-02-24 | archive-url=https://web.archive.org/web/20160224111125/https://pragprog.com/titles/tpdsl/language-implementation-patterns | dead-url=no - citation | first1=Terence | last1=Parr | date=January 15, 2013 | title=The Definitive ANTLR 4 Reference | edition=1st | publisher=Pragmatic Bookshelf | pages=328 | isbn=978-1-93435-699-9 | url=http://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference | accessdate=2015-02-17 | archive-date=2015-04-18 | archive-url=https://web.archive.org/web/20150418223945/https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference | dead-url=no 

**深入閱讀**
 doi=10.1002/spe.4380250705 

**外部連結**
  ANTLRWorksdate=20150217084519 -  ANTLR Studiodate=20150316073241 -  ANTLR tutorialdate=20150223140607  at the University of Birmingham-  Why Use ANTLR?date=20141227082857 -  Antlr plugin for Maven