ANTLR

✍ dations ◷ 2025-11-10 07:23:31 #编译器软件

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

相关

  • 急性淋巴性白血病急性淋巴性白血病(英语:Acute lymphoblastic leukemia,ALL),是因为体内淋巴细胞不正常增生造成的血液疾病。淋巴是人体免疫系统的重要环节,由骨髓与淋巴结所制造。而急性淋巴性白
  • 迪乔治症候群迪乔治综合征(DiGeorge syndrome;22q11.2缺失综合征/22q11.2 deletion syndrome)是一种遗传疾病,会导致鼻及鼻梁基部宽大、人中短、上唇薄、耳廓异常、颚裂、心脏容易出现多重异
  • INF2· cytoplasm · endoplasmic reticulum· actin cytoskeleton organization · regulation of cellular component size逆霍明2(INF2、Inverted formin-2)是在人体内由IN
  • 河口区河口区是山东省东营市下辖的一个市辖区,位于山东省北部,黄河入海口的北侧。河口区于1984年9月8日成立。其辖区面积2365.13平方公里。河口区因其地处黄河入海口而得名,人口约23
  • 国立塞切尼图书馆国立塞切尼图书馆 (匈牙利语: Országos Széchényi Könyvtár) (OSZK),匈牙利首都布达佩斯市的一个国立图书馆,为匈牙利两个国立图书馆之一(另一个是德布勒森大学图书馆)。
  • 朝鲜戏剧朝鲜戏剧是朝鲜文化的一部分,发源于史前宗教仪式。三国时期,中国和西域乐传入朝鲜半岛,朝鲜戏剧在自身本土文化的基础上,吸收外来戏剧成分从而形成独特的民族戏剧:3-4。朝鲜传统
  • 宫崎八郎宫崎 八郎(みやざき はちろう,1851年-1877年4月6日)是一位出生于熊本县的自由民权运动家。宫崎八郎的父亲是玉名郡荒尾村(今熊本县荒尾市)的一位乡士,名叫宫崎政贤(宫崎长兵卫)。宫崎
  • 敖飞帆敖飞帆(1989年1月14日-),湖北省武汉市人,中国足球运动员,现时效力于中乙球队吉林百嘉,司职中场。敖飞帆出自上海东亚梯队,2009年代表上海队获得十一运会足球比赛U20组冠军。2010年加
  • 梦想的声音 (第二季) 中国浙江卫视首播 台湾八大电视首播 台湾八大综合台首播《梦想的声音》是一档中国电视音乐节目,第二季于2017年10月27日起播出。本季四组常驻导师为羽泉、林忆莲、林俊杰和
  • 保险金信托保险金信托是结合保险与信托的金融商品,以保险金为信托财产,由保险受益人和信托机构(通常是银行)签订保险金信托契约,当被保险人身故且理赔金进入信托时,信托机构(受托人)依信托契约