您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Antlr简介及中文基础手册
Antlr简介06通讯软件06382027郑毅本文重要简介了什么是ANTLR,以及ANTLR使用,其中ANTLR使用涉及了ANTLR安装及使用,ANTLR语法文献解析,ANTLR规则(RULE)解析,ANTLR语法实例—SensorSQL,ANTLRStudio及其功能简介等。Antlr(ANotherToolforLanguageRecognition)是一种工具,前身是PCCTS,它为咱们构造自己辨认器(recognizers)、编译器(compiler)和转换器(translators)提供了一种基本。通过定义自己语言规则,Antlr可觉得咱们生成相应语言解析器,这样便可以省却了自己全手工打造劳苦。它是这样一种工具,它可以接受文法语言描述,并能产生辨认这些语言语句程序。作为翻译程序一某些,你可以使用简朴操作符和动作来参数化你文法,使之告诉ANTLR如何去创立抽象语法树(AST)和如何产生输出。ANTLR懂得如何去生成辨认程序,语言涉及Java,C++,C#和不久Python。ANTLR懂得如何构建辨认程序,这些程序可以对如下三种不同输入应用文法构造:(i)字符流,(ii)记号流,和(iii)两维树构造。很自然它们分别与词法分析程序(lexers,如下简称lexer),语言解析程序和树遍历程序向匹配。这个用于定义这些语法元语言,在所有状况下几乎同样。一旦你对ANTLR和类似工具比较顺手,你会开始以一种新目光来看编程。许多任务强烈需要语言解决方案,而不是采用老式编程语言做法。例如,这些过程注解都是用特伦斯标记语言写。而ANTLR则能来将文本(内含某些额外东西和转换)转化为HTML,PDF或者其她那些生成程序文献格式。最后,ANTLR只是一件工具,仅仅这些。虽然它能通过将容易理解乏味某些自动化来协助你创立软件,但却不能企图让你指定整个编译器。例如,在单个描述里就不行。那些宣称此类事情非常伟大,可觉得发布刊物文章编写惊人“一揽子解决方案”,却会悲惨失败在实际项目中。词法分析器(Lexer)词法分析器又称为Scanner,Lexicalanalyser和Tokenizer。程序设计语言普通由核心字和严格定义语法构造构成。编译最后目是将程序设计语言高层指令翻译成物力机器或虚拟机可以执行指令。此法分析器工作是分析量化那些本来毫无意义字符流,将她们翻译成离散字符组(也就是一种一种Token)括核心字,标记符,符号(symbols)和操作符供语法分析器使用。语法分析器(Parser)编译器又称为Syntacticalanalyser。在分析字符流时候,Lexer不关怀所生成单个Token语法意义及其与上下文之间关系,而这就是Parser工作。语法分析器将收到Tokens组织起来,并转换成为目的语言语法定义所容许序列。无论是Lexer还是Parser都是一种辨认器,Lexer是字符序列辨认器而Parser是Token序列辨认器。她们在本质上是类似东西,而只是在分工上有所不同而已。ANTLRANTLR将上述两者结合起来,它容许咱们定义辨认字符流词法规则和用于解释Token流词法分析规则。然后,ANTLR将依照顾客提供语法文献自动生成相应词法/语法分析器。顾客可以运用她们将输入文本进行编译,并转换成其她形式(如AST—AbstractSyntaxTree,抽象语法树)。Antlr使用安装及使用到下载最新版本ANTLR开发包和源码(例如版本3.01)。将antlr-3.0.1.jar所在目录配备到你环境变量中,写好语法文献(例如SensorSQL.g),运营命令“javaantlr.ToolSensorSQL.g”就可以获得自动生成语法/词法分析器。ANTLR语法文献解析下面咱们对图中所描述ANTLR语法文献做某些详细分析。为了更好使用ANTLR,你还可如下载ANTLREclipse插件来协助你完毕工作。1.header域:所有出当前这里某些,都会出当前由ANTLR编译之后生成Java文献最顶部。在本例中你可以将包名和其她信息放到这一区域中,生成成果如由面相应代码某些所示。2.你在这一某些所提供内容对于文献中每个语法都是唯一。这一区域内容将出当前实际类定义之前。也就是说,两个import仅属于类CalcParser,而不属于在同一种文献中定义其她类(如CalcLexer)3.这里是语法定义某些,你同样可以将它当作是类定义。4.在Option域中,你可觉得你语法提供可选项。例如与否建立缺省抽象语法树,指定LL(K)中参数k值(缺省为1)等等,更详细参数请参阅ANTLR自带手册。5.Token某些用来声明那些在词法分析器中没有被声明“想象”token。这些信息通惯用在TreeParser中指定“想象”节点。6.这是另一种Action区,ANTLR将会忠实地将这一区域内信息放置到类定义当中,相称于类成员办法,重要为顾客提供一种在Parser种定制可扩展办法途径。ANTLR规则(RULE)解析在ANTLR语法文献中,一种规则定义是与一种由ANTLR生成Java源文献相相应。1,2,3,4:正如你所看到那样,咱们可以在一种规则定义中作与一种函数等价所有事情。咱们可觉得规则指定参数(像上面inta),制定返回值(intc),甚至抛出一种异常。从右半面咱们可以清晰地看到,所有在规则中定义内容都被忠实而精确翻译到Java源文献相应位置。5:这一可选某些为咱们提供了指定某些可选参数能力。例如图中所示代表告诉ANTLR在生成代码时候不要生成缺省错误解决某些,这某些将由顾客自己负责。7:在异常解决某些,咱们可以指定自定义异常解决办法。像这里就仅仅是打印错误栈信息。ANTLR语法实例—SensorSQLSensorSQL是一种自定义简化版SQL语言,它所支持语法定义这里就不详细列出了,我只是给出查询示例:普通,编译一种查询目是要把它转化成某种被查询设备可以理解形式。普通做法有两种,一种是像在上一节中提到那样,写好详细语法规则,在ANTLR生成相应Java文献之后,就可以直接使用其运营成果。这样例子有诸多,其中最典型就是对于算数表达式解析了。对于形如1+2-3*4/5^6这样表达式,只要写好语法规则,就可以在解析过程中直接得到运算成果:一方面ANTLR将其编译成逆波兰构造--(-(+12)(/(*34)(^56)));在生成语法树过程中,同步计算表达式值,即类似于2.3节中看到表达式计算。成果如下:但是这样作有一种缺陷,就是在诸多状况下,你也许并不懂得要用什么样办法来解决。因此当真正要开始写解决代码时候,就要受限于已有Parser/Lexer中代码。一旦要有所修改,就要重新编译语法文献,生成新Java代码,不胜繁琐。并且,一旦解决过程有误,就要重复调试修改Antlr生成代。自动生成代码嘛,构造着实也不怎么样,调试时候也麻烦。因此如果效率容许话,就没有必要让Antlr作额外工作,干脆就专心于做她语法分析也就是了,其她工作等到生成语法树之后再怎么遍历或者折腾都可以嘛J。上图就是刚才演示SensorSQL语法分析之后产生成果。在产生这个成果之后,我需要将每一种语法元素翻译成字节序列打包发送给传感器网络。这时候,为了保证Where语句中优先级,你就可以按照ANTLR文档中关于生成语法树一章,生成类似于这样构造,然后只需前序遍历这颗语法树Where某些就可以达到目,至于其她某些,顺序遍历一遍就好了。ANTLRStudio有了前面基本之后,咱们就可以开始真正工作了。但是用“记事本或Editplus+命令行”或者干脆写个ANT脚本也不是不可以,但是总觉得在集成化IDE满天飞时代用这个方式有点过于原始,幸好PlacidSystem为咱们提供了一种Eclipse插件来使咱们有机会直接走出原始社会。下载地址为:,当前最新版本是1.1.0。唯一令人遗憾是这个插件虽然功能很完善,却是要收费,否则只有11天试用期。ANTLRStudio插件安装Eclipse下插件安装自不必多说,要注意是从PlacidSystem网站上提供license文献,下载之后它名字为license.lic.txt,要把它后缀名.txt去掉,然后放到ECLIPSE_DIR\plugins\AntlrStudio_x.x.x目录(这里x.x.x是版本号,例如-1.1.0)。安装成功之后在Eclipse工具栏上会浮现一种词法分析器导航按钮:当右键单点击你工程时,你会发现控制与否使用ANTLRStudio开关:当打开一种文法文献之后,可以看到如下界面:在右面大纲窗口,列有所有Parser和Lexer元素,可以看到ProtectedToken(例如Number)和其她普通Token是不同样;在左面,不同区域是用不同颜色块加亮来区别。功能简介ANTLRStudio在EclipseHelp提供了比较详尽文档描述,因此这里我只简介某些1.1.0版本新功能。l完全支持ANTLR3.0.1,并支持将之前工程自动升级到1.1.0版本。lSyntaxDiagramView,可以以便查看所输入语法构造。l改进了Debug功能,可以调试比较大文法文献。而在这之前,如果一种文法文献很大话,ANTLRStudio就会抛出异常。l支持自动代码补全功能,提供一种ANTLR文档比较全面提示信息(如下所示)。语法图表视图(SyntaxDiagramView)在Window-ShowView-Other中选取显示这个视图之后,你就可以使用这个很酷功能了运用这个视图,你可以很容易看到你定义语法语法构造,例如,我SELECT语句定义如下你只需要将光标标放到selectStatement规则任意位置,就可以在SyntaxDiagramView中看到:于是完整语法构造清晰显示在了咱们面前。这时你只需要将光标放到脱字符号(^)上面(注:脱字符号用于指明在生成语法树时候,脱字符号所在SubRule要作为树或子树根节点):就会看到:相应SubRule被加亮成粉红色,而如果你光标放到位置是一种Token话就会变成淡蓝色,简直太酷了。增强Debug功能想要启动或关闭ANTLRStudioDebug功能,需要完毕如下环节:l在工程中启用/取消ANTLRStudiol右键单击工程,打开“属性”中ANTLRStudio选项卡。l选取/取消'Enabledebuggingingrammarfiles'做完这些后,咱们就可以痛快使用其Debug功能了。与调试其她Java文献同样,咱们可以在语法文献任意位置插入断点:当程序运营至断点之后,咱们同样可以像调试普通应用程序同样使用诸如“跳过”,“继续”等Java应用程序Debug方式来进行,十分以便和顺手。注:以上资料均来于网络,鄙人收集整顿。ANTLR中文手册06通讯软件06382027郑毅本文重要概括了某些惯用ANTLR用法,其中有Antlr重要类,Antlr文法文献形式,生成Java类,如何生成Java类,如何执行以及元语言词汇表。一、Antlr重要类:Antlr中有重要类有两种(其实尚有一种TreeLexer)Lexer:文法分析器类。重要用于把读入字节流依照规则分段。既把长面条依照你要尺寸切成一段一段:)并不对其作任何修改。Parser:解析器类。重要用于解决通过Lexer解决后各段。某些详细操作都在这里。二、Antlr文法文献形式:Antlr文献是*.g形式,即以g为后缀名。例如:t.gclassPextendsParser;startRule:n:NAME{System.out.println(Hithere,n.getText());};classLextendsLexer;//one-or-morelettersfollowedbyanewlineNAME:(’a’……’z’|’A’……’Z’);NEWLINE:’\r’’\n’//DOS|’\n’//UNIX;详细成分分析:1、总体构造ClassPextendsParserClassLextendsLexerNEWLINE两行同JAVA继承同样,P继承Par
本文标题:Antlr简介及中文基础手册
链接地址:https://www.777doc.com/doc-8767241 .html