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