ANTLR

✍ dations ◷ 2025-06-08 01:50:13 #编译器软件

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

相关

  • 单倍体染色体倍性是指细胞内同源染色体的数目,只有一组最基本的称为“单套”或“单倍体”(haploid),两组备份称为“双套”或“二倍体”(diploid)。多倍体的细胞则有更多套的染色体。其中
  • 社日社日,东亚传统祭祀土地神的节日,分别于春分与秋分之后举行。春分前后名曰春社,秋分前后名曰秋社。汉朝以前只有春社,汉朝以后始有秋社。自宋代起,以立春、立秋后的第五个戊日为社
  • 赫默尔亨普斯特德赫默尔亨普斯特德(英语:Hemel Hempstead)是位于英国东英格兰的一座城市,在行政区划上属于哈特福郡。赫默尔亨普斯特德是一座大规模新市镇,位于伦敦西北24英里(38.6千米)处,是大伦敦
  • 焦晃焦晃(1936年7月8日-),出生于北京,中国话剧演员,一级演员。1955年至1959年就读于上海戏剧学院表演系本科,1959年毕业后,进入上海青年话剧团工作,素有“莎剧王子”之誉。现为中国戏剧家
  • 在来线在来线是日本铁路用语,意指新干线以外的旧国铁/JR铁道路线。日文中“在来”(日语:在来)一词解作“向来、一直以来、既有”,指全部使用窄轨(1,067毫米轨距)的国铁既有路线,以便与较晚
  • 灯笼果灯笼果(学名:),又称秘鲁苦蘵,是茄科酸浆属的一种多年生草本植物,植株高0.5-2.0米。果子是一个套着灯笼型荚子的小圆果,比拇指大一点,里面有很多小籽。成熟的果实是亮黄色,非常甜,可以
  • 赵德吉国赵德吉亦作赵得吉(1896年-1954年5月23日),山东莒南县人,中华人民共和国时期称帝者,1954年在山东莒南县称帝。莒南县十字路镇西芦家林村人赵德吉,1925年加入九宫道,任盘主。1941年后
  • 马修·诺什卡马修·诺什卡(英语:Matthew Noszka,1992年10月27日-),是一名美国男性模特儿和演员。马修现在是Women / 360 models、Elite模特儿经纪公司旗下的模特儿,他曾为Nike、Calvin Klein、H
  • 戈氏姬地鸠戈氏姬地鸠(学名:)是鸠鸽科姬地鸠属的一种,原生于澳大利亚和新几内亚。 本种与东南亚的斑姬地鸠和帝汶姬地鸠的为近缘物种,三者曾被当成同一物种。本种是相对较小的鸽类,体长从从1
  • 李健李健(1974年9月23日-),黑龙江哈尔滨人,中国大陆当代创作男歌手。1974年出生于哈尔滨,父亲李久良是黑龙江省京剧院武生。刚上初中时李健受电影《路边吉他队》的影响,开始学习吉他。1