《ANTLR 4权威指南 》一3.4 构建一个语言类应用程序

3.4 构建一个语言类应用程序

我们继续完成能够处理数组初始化语句的示例程序,下一个目标是能够翻译初始化语句,而不仅仅是能够识别它们。例如,我们想要将Java中,类似{ 99, 3, 451 }的short数组翻译成"\u0063\u0003\u01c3"。注意,其中十进制数字99的十六进制表示是63。
为了完成这项工作,程序必须能够从语法分析树中提取数据。最简单的方案是使用ANTLR内置的语法分析树遍历器进行深度优先遍历,然后在它触发的一系列回调函数中进行适当的操作。正如我们之前看到的那样,ANTLR能够自动生成一个监听器接口和一个默认的实现类。这样的监听器非常类似于图形界面程序控件上的回调函数(例如,当一个按钮被按下时,它会通知我们)或者XML解析器中的SAX事件。
我们如果想要通过编写程序来操纵输入的数据的话,只需要继承ArrayInitBaseListener类,然后覆盖其中必要的方法即可。我们的基本思想是,在遍历器进行语法分析树的遍历时,令每个监听器方法翻译输入数据的一部分并将结果打印出来。
监听器机制的优雅之处在于,我们不需要自己编写任何遍历语法分析树的代码。事实上,我们甚至都不知道ANTLR运行库是怎么遍历语法分析树、怎么调用我们的方法的。我们只知道,在语法规则对应的语句的开始和结束位置处,我们的监听器方法可以得到通知。在7.2节我们会看到,这种机制使得我们不需要了解太多ANTLR的知识——我们回到了自己熟悉的领域,即写普通的代码而不是处理语言识别问题。
一个进行翻译工作的项目意味着要处理这样的问题:如何将输入的词法符号或者词组翻译成输出字符串。为了达到这个目标,最好先从手工翻译一些有代表性的样例入手,想办法提取出通用的转换逻辑。在下例中,转换过程是非常直截了当的。

用自然语言解释,翻译过程就是一系列“X映射为Y”的过程:
1)将{翻译为"。
2)将}翻译为"。
3)将每个整数翻译为四位的十六进制形式,然后加前缀\u。
为此,我们需要编写方法,在遇到对应的输入词法符号或者词组的时候,打印出转换后的字符串。内置的语法分析树遍历器会在各种词组的开始和结束位置触发监听器的回调函数。下面是遵循我们的翻译规则的一个监听器的实现类。

我们不需要覆盖每个enter/exit方法,我们只需要覆盖自己需要的那些。上述代码中唯一令我们不那么熟悉的一个表达式是ctx.INT(),它从上下文对象中获取INT词法符号对应的整数值,该词法符号由匹配value规则得来。现在,剩下的事情就是把之前的Test类扩展成一个翻译程序了。


这份代码和之前代码的唯一区别在于高亮标识的部分,它新建了一个语法分析树遍历器,令其对语法分析器生成的语法分析树进行遍历。在遍历器的遍历过程中,它触发了我们的ShortToUnicodeString监听器的回调函数。请注意:限于篇幅,为了使读者的注意力更加集中,在本书剩下的章节中,通常仅给出代码的关键部分而非完整代码。此外,你还可以从本书的网站上获取完整的代码压缩包。
最后,让我们一起完成这个翻译器,并使用样例输入来测试。

一切顺利。无须深入理解语法的细节,我们就完成了我们的第一个翻译器。我们所做的一切不过是实现了几个方法,在这些方法中打印出对输入文本的适当的翻译结果。另外,我们可以通过给遍历器传递一个不同的监听器以实现完全不同的输出。监听器有效地将语言类应用程序和语法进行了解耦,从而使得同一个语法能够被不同的程序复用。
下一章,我们将快速学习ANTLR语法的编写方法,以及让ANTLR语法如此强大和易用的关键特性。

时间: 2024-08-01 17:57:53

《ANTLR 4权威指南 》一3.4 构建一个语言类应用程序的相关文章

《ANTLR 4权威指南》——3.4 构建一个语言类应用程序

3.4 构建一个语言类应用程序 我们继续完成能够处理数组初始化语句的示例程序,下一个目标是能够翻译初始化语句,而不仅仅是能够识别它们.例如,我们想要将Java中,类似{ 99, 3, 451 }的short数组翻译成"\u0063\u0003\u01c3".注意,其中十进制数字99的十六进制表示是63. 为了完成这项工作,程序必须能够从语法分析树中提取数据.最简单的方案是使用ANTLR内置的语法分析树遍历器进行深度优先遍历,然后在它触发的一系列回调函数中进行适当的操作.正如我们之前看到

《ANTLR 4权威指南》——3.4节构建一个语言类应用程序

3.4 构建一个语言类应用程序 我们继续完成能够处理数组初始化语句的示例程序,下一个目标是能够翻译初始化语句,而不仅仅是能够识别它们.例如,我们想要将Java中,类似{ 99, 3, 451 }的short数组翻译成"\u0063\u0003\u01c3".注意,其中十进制数字99的十六进制表示是63. 为了完成这项工作,程序必须能够从语法分析树中提取数据.最简单的方案是使用ANTLR内置的语法分析树遍历器进行深度优先遍历,然后在它触发的一系列回调函数中进行适当的操作.正如我们之前看到

《ANTLR 4权威指南 》一导读

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

《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权威指南》——第3章 入门的ANTLR项目 3.1 ANTLR工具、运行库以及自动生成的代码

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

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

3.1 ANTLR工具.运行库以及自动生成的代码 在开始前,我们先浏览一下ANTLR的jar包中的内容.在ANTLR的jar包中存在两个关键部分:ANTLR工具和ANTLR运行库(运行时语法分析)API.通常,当说到"对一个语法运行ANTLR"时,我们指的是运行ANTLR工具,即org.antlr.v4.Tool类来生成一些代码(语法分析器和词法分析器),它们能够识别使用这份语法代表的语言所写成的语句.词法分析器将输入的字符流分解为词法符号序列,然后将它们传递给能够进行语法检查的语法分

《ANTLR 4权威指南》——2.4 使用语法分析树来构建语言类应用程序

2.4 使用语法分析树来构建语言类应用程序 为了编写一个语言类应用程序,我们必须对每个输入的词组或者子词组执行一些适当的操作.进行这项工作最简单的方式是操作语法分析器自动生成的语法分析树.这种方式的优点在于,我们能够重回我们所熟悉的Java领域.这样,在语言类应用程序进一步的构建过程中,我们就不需要再学习复杂的ANTLR语法了. 首先,我们来认识一下ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名.熟悉这些数据结构将为我们未来的讨论奠定基础. 前已述及,词法分析器处理字符序列并将生成

《ANTLR 4权威指南 》一2.4 使用语法分析树来构建语言类应用程序

2.4 使用语法分析树来构建语言类应用程序 为了编写一个语言类应用程序,我们必须对每个输入的词组或者子词组执行一些适当的操作.进行这项工作最简单的方式是操作语法分析器自动生成的语法分析树.这种方式的优点在于,我们能够重回我们所熟悉的Java领域.这样,在语言类应用程序进一步的构建过程中,我们就不需要再学习复杂的ANTLR语法了. 首先,我们来认识一下ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名.熟悉这些数据结构将为我们未来的讨论奠定基础. 前已述及,词法分析器处理字符序列并将生成