ANTLR

✍ dations ◷ 2025-12-01 18:19:52 #编译器软件

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

相关

  • 流泪泪或称泪液、泪水,是眼睛外部的泪腺所分泌的液体。泪的原料是血液中的水分,它经由泪腺分泌出来后、通过并润湿眼球表面,之后进入鼻泪管,流入鼻腔内而进入喉咙。 它不只可湿润眼
  • 反射增强阵孪性状态,简称阵挛,为一系列由于肌肉突然的拉扯产生非自主性的肌肉节律性收缩。阵挛是一种特定的神经现象,特别是上运动神经元疾病(UMNL),如渐冻人(ALS)、中风、多发性硬化、脊髓
  • 水历水历是水族特有的历法。现行水历与夏历大体一致,主要区别在于水历建戌,以夏历九月为岁首。水历起初是一种物候历(自然历)。水族先民通过观察气象变化、候鸟迁栖等自然现象来预测
  • 即兴曲即兴曲(法语:impromptu,/ɪmˈprɒmptjuː/, 法语发音:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","
  • 德布罗意方程组德布罗意方程组是描述物质波的方程组。德布罗意方程组描述了波长 λ {\displaystyle \lambda } 与动量 p
  • 鸟蛤亚科见内文鸟蛤亚科(学名:Cardiinae),亦作鸟尾蛤亚科,是软体动物门双壳纲鸟蛤目鸟蛤科之下的一个亚科。根据《中国动物志•无脊椎动物》(第48卷,2012年)及WoRMS,本亚科包括下列五个属:《
  • 费赞费赞(阿拉伯语:فزان‎ ,柏柏尔语:Fezzan,土耳其语:Fizan,拉丁语:Phasania),又译菲赞,是北非的一个历史地区,属于撒哈拉沙漠的一部分,位于今利比亚西南部。费赞地区气候极端,冬冷夏热。
  • 颚针蚁属 Wheeler, 1929 Mayr, 1862 颚针蚁属 ( ) 主要栖息于热带及亚热带地区,少数几种栖息于温带地区,具有触发式大颚 (trap-jaw) ,肉食性。姊妹群为锯针蚁属,锯针蚁属和颚针蚁属是锯
  • 林逸翔MLBCPBL林逸翔(Yi-Hsiang Lin,1992年12月16日-),曾为台湾旅美棒球选手,目前效力于乐天桃猿队,守备位置为投手。2012年球季前,由巴尔的摩金莺以15万美元签约金签下当时就读国立台湾体
  • 能指能指(signifier),也叫做意符,语言学和符号学概念,指一个有特定含义的记号(通常表现为声音或图像)能够引发人们对特定对象事物的概念联想。索绪尔在《普通语言学教程》中普及了能指