ANTLR

✍ dations ◷ 2025-08-08 02:48:39 #编译器软件

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的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的使用列表:

相关

  • 喘鸣喘鸣(英语:Wheeze, Sibilant Rhonchi),又称啰音,是指呼吸过程中呼吸道持续产生的粗糙声音。哮鸣发生的原因是由于呼吸道的某些部分缩小或被堵塞,亦可能是呼吸道内的气流速度提高。
  • 二氢乳清酸酶二氢乳清酸酶(英语:Dihydroorotase,EC 3.5.2.3)也称为氨甲酰天冬氨酸脱水酶(英语:carbamoylaspartic dehydrase)又叫作二氢乳清酸酶水解酶(英语:dihydroorotate hydrolase)催化嘧啶生
  • 武汉铁路局中国铁路武汉局集团有限公司,原名武汉铁路局,为中国国家铁路集团下属公司。国铁武汉局集团公司于2017年铁路局公司化改制而成,管辖范围基本上在湖北省全境以及河南省南部、安徽
  • 陈锡禄陈锡禄(1928年2月6日-2008年1月16日)圣名玛弟亚,天主教景县教区主教,为梵蒂冈任命,也获中华人民共和国政府承认。1928年2月6日,陈锡禄出生在中国河北省冀县的天主教家庭。1943年开
  • 幻痛 (消歧义)幻痛有以下的意思:
  • 平梁镇平梁镇可以指:
  • 尼古拉·马丁内斯库尼古拉·马丁内斯库(罗马尼亚语:Nicolae Martinescu,1940年2月24日-2013年4月1日),罗马尼亚男子摔跤运动员,1972年慕尼黑奥运会冠军。1940年2月24日,马丁内斯库生于罗马尼亚布勒伊拉
  • 张菁菁张菁菁(Arlena,1995年3月24日-),台湾女模特儿及节目主持人。张菁菁于2014年起以本名张芸菁成为模特儿和Showgirl,于2015年担任节目华视综艺节目《财神向钱冲》中担任助理主持,节目
  • 艾琳·格雷艾琳·格雷(英语:Eileen Gray,1878年8月9日-1976年10月31日),出生全名是凯瑟琳·艾琳·莫雷·史密斯(Kathleen Eileen Moray Smith),爱尔兰恩尼斯科西出生的法国建筑师,同时也是家俱
  • 德贵丽类德贵丽类是一定种鸡尾酒类,主要以兰姆酒为主要配料。德贵丽是1896年由一位在古巴一个叫德贵丽的铁矿工作的美国工程师Jennings S. Cox发明的。据说海明威很爱喝这种鸡尾酒。