ANTLR指南(v3.0).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ANTLR指南(v3.0)

ANTLR指南(v3.0) ANTLR是ANother Tool for Language Recognition的缩写“又一个语言识别工具”。从名字上可以看出在ANTLR出现之前已经存在其它语言识别工具了(如LEX[1],YACC[2])。ANTLR的官方定义为:根据一种可以嵌入如Java, C++或C#等辅助代码段的文法,来构筑出相对该文法的识别器,编译器或翻译器的一种语言工具框架。这个定义说明了ANTLR的功能是根据给定文法自动生成编译器,其过程为先编写相应语言的文法然后生成相应语言编译器。定义提到的语言识别器,编译器和翻译器我们以后统称为语法分析器。事实上ANTLR是生成相应语言编译器的源代码,我们还需要编译它。那么ANTLR可以生成哪些方语言的语法分析器源代码语言的代码呢?这是程序员很关心的问题。幸运的是ANTLR现在已经支持了多种当前流行的开发语言,包括Java、C#、C、C++、Objective-C、Python和 Ruby.1等。你可以根据需要生成其中任何一种语言的语法分析器。本书主要介绍java,C#两种语言,有详细的操作步骤包括如何编译、执行和如何使用ANTLRWorks开发环境编写文法等。读者可以顺利上手,避免实际操作的障碍。后面章节还会指出在Java和C#开发中应注意的细微差别,确保程序的顺利运行。 1.1开发Hello World示例 本章将开发一个简单示例让读者对ANTLR有一个初步的认识,并搭建开发环境以便后续的学习。读者在示例中遇到不懂的地方也不必担心,我们的目的是搭建开发环境学会编译运行语法分析器。用ANTLR开发一个语法分析器大致分三步,第一步:写出要分析内容的文法。第二步:用ANTLR生成相对该文法的语法分析器的代码。第三步:编译运行语法分析器。 和多数编译书籍一样,本章也用解析简单的表达式作为示例。要解析的表达式中有二种数据类型:整数 如“23”, “5” 和字符串 如“Hello World”。表达式中以算术表达式为主也包括赋值表达式。我们列举两个表达式语句: 23+4*(5+1); str=“Hello World”; 第一条语句是一个算术表达式,括号改变了运算顺序,计算结果不赋给任何变量。第二条是一个赋值表达式,将字符串赋给一个变量。后面我们要开发一个语法分析器来分析这两条语句。在开发之前先简单提一下语法树的概念,在语法分析中一般用树来表示语法结构,表达式的语法树是以操作符为根节点操作数为子节点的树形结构,23+4*(5+1)的语法树根据操作符的优先级如下。 图1.1 算术表达式先计算5+1,5+1在括号中操作符的优先级最高在语法树中的深度最大,然后是4*(5+1),最后是23+4*(5+1)。可以看出语法树的求值顺序是从下向上的,先计算深度大的操作符5+1结果为6,然后是4*6结果为24,然后是23+24表达式的结果为47。下面再看一下赋值表达式的语法树结构: 图1.2 赋值操作符“=”做为根节点变量str作为左子树,而字符串表达式“Hello World” 作为右子树。了解了语法树后我们开始录入文法源文件。ANTLR中文法文件是扩展名为“.g”的文本文件,“.g”文件就是我们的源文件。这里新建一个叫“E.g”的文法文件,在文件中输入如下文法定义: grammar E; options{ output=AST;} program : statement + ; statement: (expression | VAR = expression) ; ; expression : (multExpr ((+ |- ) multExpr)*) | STRING; multExpr : atom (* atom)*; atom : INT | ( expression ); VAR : (a..z |A..Z )+ ; INT : 0..9 + ; STRING : ((A..Z | a..z | ) +) ; WS : ( |\t |\n |\r )+ {skip();} ; 文件的第一行grammar E的E为文法的名称它与文件名一致。第二行是文法的设置部分options{ output=AST;},output=AST表示让语法分析器返回包含语法树的信息。第三行开始是文法定义部分,文法是用EBNF1推导式来描述的(有关EBNF会在后面章节中讲解),文法定义中分两大部分以小写字母开头的语法描述和全大写的词法描述。其中每一行都是一个规则(rule)或叫做推导式、产生式,每个规则的左边是文法中的一个名字,代表文法中的一个抽象概念。中间用一个“:”表示推导关系,右边是该名字推导出的文法形式。下面逐行介绍文法的规则定义: statement

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档