《ANTLR 4权威指南》——3.1节ANTLR工具、运行库以及自动生成的代码

3.1 ANTLR工具、运行库以及自动生成的代码
在开始前,我们先浏览一下ANTLR的jar包中的内容。在ANTLR的jar包中存在两个关键部分:ANTLR工具和ANTLR运行库(运行时语法分析)API。通常,当说到“对一个语法运行ANTLR”时,我们指的是运行ANTLR工具,即org.antlr.v4.Tool类来生成一些代码(语法分析器和词法分析器),它们能够识别使用这份语法代表的语言所写成的语句。词法分析器将输入的字符流分解为词法符号序列,然后将它们传递给能够进行语法检查的语法分析器。运行库是一个由若干类和方法组成的库,这些类和方法是自动生成的代码(如Parser,Lexer和Token)运行所必须的。因此,我们完成工作的一般步骤是:首先我们对一个语法运行ANTLR,然后将生成的代码与jar包中的运行库一起编译,最后将编译好的代码和运行库放在一起运行。
构建一个语言类应用程序的第一步是创建一个能够描述这种语言的语法(即合法语句结构的集合)的语法。我们将在第5章中介绍如何编写语法,现在我们先来看下面这个能够满足我们需求的语法。

请将语法文件ArrayInit.g4放入一个单独的文件夹,例如/tmp/array(通过复制-粘贴或者从本书网站下载)。然后我们对它运行ANTLR工具。

3)ArrayInit.tokens:ANTLR会给每个我们定义的词法符号指定一个数字形式的类型,然后将它们的对应关系存储于该文件中。有时,我们需要将一个大型语法切分为多个更小的语法,在这种情况下,这个文件就非常有用了。通过它,ANTLR可以在多个小型语法间同步全部的词法符号类型。更多内容请参阅4.1节中的“语法导入”部分。
4)ArrayInitListener.java, ArrayInitBaseListener.java:默认情况下,ANTLR生成的语法分析器能将输入文本转换为一棵语法分析树。在遍历语法分析树时,遍历器能够触发一系列“事件”(回调),并通知我们提供的监听器对象。ArrayInitListener接口给出了这些回调方法的定义,我们可以实现它来完成自定义的功能。ArrayInitBaseListener是该接口的默认实现类,为其中的每个方法提供了一个空实现。ArrayInitBaseListener类使得我们只需要覆盖那些我们感兴趣的回调方法(详见7.2节)。通过指定-visitor命令行参数,ANTLR也可以为我们生成语法分析树的访问器(参阅7.5节“使用访问器遍历语法分析树”部分)。
接下来,我们将使用监听器来将short数组初始化语句转换为字符串对象,不过在这之前,我们首先使用一些样例输入来验证我们的语法分析器是否能正常进行匹配工作。
ANTLR语法比正则表达式功能更强大
熟悉正则表达式的读者可能会产生疑问,使用ANTLR来解决这么简单的识别问题是不是有点小题大做了?实际上,由于嵌套的花括号结构的存在,正则表达式无法识别这样的初始化语句。正则表达式没有存储的概念,它们无法记住之前匹配过的输入。因此,它们不能将左右花括号正确配对。我们将在5.3节“嵌套模式”部分中予以详细讨论。

时间: 2024-08-03 14:42:01

《ANTLR 4权威指南》——3.1节ANTLR工具、运行库以及自动生成的代码的相关文章

《ANTLR 4权威指南》——第3章 入门的ANTLR项目 3.1 ANTLR工具、运行库以及自动生成的代码

第3章 入门的ANTLR项目 作为我们的第一个ANTLR项目,我们会构造一个语法,它是C语言或其继承者Java语法的一个很小的子集.具体来说,我们将识别包裹在花括号或者嵌套的花括号中的一些整数,像是{1, 2, 3}和{1, {2, 3}, 4}这样.这样的结构可以作为int数组或者C语言中的结构体的初始化语句.在很多情况下,针对这种语法的语法分析器都非常有用.例如,我们可以用它来构建一个对C语言的源代码进行重构的工具,这个工具能够完成这样的工作:如果初始化语句中所有的整数值都能用一个字节表示,

《ANTLR 4权威指南 》一1.2 运行ANTLR并测试识别程序

1.2 运行ANTLR并测试识别程序 下面是一个简单的.识别类似hello world和hello parrt的词组的语法: 为整洁起见,我们把这个语法文件放到它自己的目录里,如/tmp/test.接下来对该语法文件运行ANTLR命令并编译生成的结果. 对Hello.g4运行ANTLR工具命令生成了一个由HelloParser.java和HelloLexer.java组成的.可以运行的语法识别程序,不过我们还缺一个main程序来触发这个语言识别的过程.(语法分析器和词法分析器的介绍详见下一章.)

《ANTLR 4权威指南 》一导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《ANTLR 4权威指南 》一第3章 入门的ANTLR项目

第3章 入门的ANTLR项目 作为我们的第一个ANTLR项目,我们会构造一个语法,它是C语言或其继承者Java语法的一个很小的子集.具体来说,我们将识别包裹在花括号或者嵌套的花括号中的一些整数,像是{1, 2, 3}和{1, {2, 3}, 4}这样.这样的结构可以作为int数组或者C语言中的结构体的初始化语句.在很多情况下,针对这种语法的语法分析器都非常有用.例如,我们可以用它来构建一个对C语言的源代码进行重构的工具,这个工具能够完成这样的工作:如果初始化语句中所有的整数值都能用一个字节表示,

《ANTLR 4权威指南》——导读

前 言 ANTLR是一款强大的语法分析器生成工具,可用于读取.处理.执行和翻译结构化的文本或二进制文件.它被广泛应用于学术领域和工业生产实践,是众多语言.工具和框架的基石.Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询:Hadoop生态系统中的Hive.Pig.数据仓库和分析系统所使用的语言都用到了ANTLR:Lex Machina将ANTLR用于分析法律文本:Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR:NetBeans公司的IDE使用ANTLR来解

《ANTLR 4权威指南》——1.1节安装ANTLR

1.1 安装ANTLR ANTLR是用Java编写的,因此你需要首先安装Java,哪怕你的目标是使用ANTLR来生成其他语言(如C#和C++)的解析器.(我希望在不远的未来ANTLR可以支持更多语言.)ANTLR运行所需的Java版本为1.6或更高. 为什么本书使用命令行 在整本书中,我们都会使用命令行(shell)来运行ANTLR和构建我们的程序.因为开发者使用的开发环境和操作系统五花八门,因此只有操作系统的shell才是我们公用的"界面".使用shell也使得开发语言程序的每一个步

《ANTLR 4权威指南 》一3.3 将生成的语法分析器与Java程序集成

3.3 将生成的语法分析器与Java程序集成 在语法准备就绪之后,我们就可以将ANTLR自动生成的代码和一个更大的程序进行集成.在本节中,我们将会使用一个简单的Java示例程序的main()方法调用我们的"初始化语句解析器",并打印出和TestRig的"-tree"选项类似的语法分析树.下面是完整的Test.java程序,它体现出了2.1节中的完整的识别流程. 上面的程序使用了很多ANTLR运行库的类,像是CommonTokenStream和ParseTree,我们

《ANTLR 4权威指南》——3.3 将生成的语法分析器与Java程序集成

3.3 将生成的语法分析器与Java程序集成 在语法准备就绪之后,我们就可以将ANTLR自动生成的代码和一个更大的程序进行集成.在本节中,我们将会使用一个简单的Java示例程序的main()方法调用我们的"初始化语句解析器",并打印出和TestRig的"-tree"选项类似的语法分析树.下面是完整的Test.java程序,它体现出了2.1节中的完整的识别流程. 上面的程序使用了很多ANTLR运行库的类,像是CommonTokenStream和ParseTree,我们

《ANTLR 4权威指南》——第1章 初识ANTLR 1.1 安装ANTLR

第1章 初识ANTLR 在本书的第一部分中,我们的目标是大体上知道ANTLR能做什么.除此之外,我们还希望探究语言类应用程序的架构.在概览之后的第2章中,我们将会通过许多真实的例子来循序渐进地.系统性地学习ANTLR.在开始之前,我们需要首先安装ANTLR,然后尝试用它编写一份简单的"hello world"语法. 1.1 安装ANTLR ANTLR是用Java编写的,因此你需要首先安装Java,哪怕你的目标是使用ANTLR来生成其他语言(如C#和C++)的解析器.(我希望在不远的未来