ANTLR
ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Java语言编写,使用自上而下(top-down)的递归下降LL剖析器方法。由旧金山大学的Terence Parr博士等人于1989年开始发展。
原作者 | Terence Parr 与其他参与者 |
---|---|
首次发布 | 1992年2月 |
当前版本 |
|
源代码库 | |
编程语言 | Java |
平台 | Cross-platform |
许可协议 | BSD License |
网站 | www |
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[2]。
如同一般的词法分析器(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)[3],这是所有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 project(页面存档备份,存于互联网档案馆) 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 IDEA(页面存档备份,存于互联网档案馆) and Clion.(页面存档备份,存于互联网档案馆)
- Apache Cassandra
- Processing
参见
编辑注释
编辑- ^ Release 4.13.2. 2024年8月3日 [2024年8月20日].
- ^ SML/NJ Language Processing Tools: User Guide (PDF). [2015-02-17]. (原始内容存档 (PDF)于2014-12-01).
- ^ ANTLR会提示:“rule is left-recursive”错误。
文献
编辑- Parr, Terence, The Definitive Antlr Reference: Building Domain-Specific Languages 1st, Pragmatic Bookshelf: 376, May 17, 2007 [2015-02-17], ISBN 0-9787392-5-6, (原始内容存档于2016-04-03)
- Parr, Terence, Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages 1st, Pragmatic Bookshelf: 374, December 2009 [2015-02-17], ISBN 978-1-934356-45-6, (原始内容存档于2016-02-24)
- Parr, Terence, The Definitive ANTLR 4 Reference 1st, Pragmatic Bookshelf: 328, January 15, 2013 [2015-02-17], ISBN 978-1-93435-699-9, (原始内容存档于2015-04-18)
深入阅读
编辑- Parr, T.J.; Quong, R.W. ANTLR: A Predicated-LL(k) Parser Generator. Software: Practice and Experience. July 1995, 25 (7): 789–810. doi:10.1002/spe.4380250705.
外部链接
编辑- 官方网站
- ANTLRWorks(页面存档备份,存于互联网档案馆)
- ANTLR Studio(页面存档备份,存于互联网档案馆)
- ANTLR tutorial(页面存档备份,存于互联网档案馆) at the University of Birmingham
- Why Use ANTLR?(页面存档备份,存于互联网档案馆)
- Antlr plugin for Maven