《ANTLR 4权威指南 》一2.5 语法分析树监听器和访问器

简介: ANTLR的运行库提供了两种遍历树的机制。默认情况下,ANTLR使用内建的遍历器访问生成的语法分析树,并为每个遍历时可能触发的事件生成一个语法分析树监听器接口(parse-tree listener interface)。监听器非常类似于XML解析器生成的SAX文档对象。

本节书摘来自华章出版社《ANTLR 4权威指南 》一书中的第2章,第2.5节,[美] 特恩斯·帕尔(Terence Parr) 著张 博 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 语法分析树监听器和访问器

ANTLR的运行库提供了两种遍历树的机制。默认情况下,ANTLR使用内建的遍历器访问生成的语法分析树,并为每个遍历时可能触发的事件生成一个语法分析树监听器接口(parse-tree listener interface)。监听器非常类似于XML解析器生成的SAX文档对象。SAX监听器接收类似startDocument()和endDocument()的事件通知。一个监听器的方法实际上就是回调函数,正如我们在图形界面程序中响应复选框点击事件一样。除了监听器的方式,我们还将介绍另外一种遍历语法分析树的方式:访问者模式(vistor pattern)。
1.语法分析树监听器
为了将遍历树时触发的事件转化为监听器的调用,ANTLR运行库提供了ParseTree-
Walker类。我们可以自行实现ParseTreeListener接口,在其中填充自己的逻辑代码(通常是调用程序的其他部分),从而构建出我们自己的语言类应用程序。
ANTLR为每个语法文件生成一个ParseTreeListener的子类,在该类中,语法中的每条规则都有对应的enter方法和exit方法。例如,当遍历器访问到assign规则对应的节点时,它就会调用enterAssign()方法,然后将对应的语法分析树节点——AssignContext的实例——当作参数传递给它。在遍历器访问了assign节点的全部子节点之后,它会调用exitAssign()。图2-4用粗虚线标识了ParseTreeWalker对语法分析树进行深度优先遍历的过程。
2_4
图2-4 ParseTreeWalker对语法分析树进行深度优先遍历的过程
除此之外,图2-4中还标识出了遍历过程中ParseTreeWalker调用assign规则的enter和exit方法的时机(其中未显示监听器其他方法的调用)。图2-5显示了在我们的赋值语句生成的语法分析树中,ParseTreeWalker对监听器方法的完整的调用顺序。
2_5
监听器机制的优秀之处在于,这一切都是自动进行的。我们不需要编写对语法分析树的遍历代码,也不需要让我们的监听器显式地访问子节点。
2.语法分析树访问器
有时候,我们希望控制遍历语法分析树的过程,通过显式的方法调用来访问子节点。在命令行中加入-visitor选项可以指示ANTLR为一个语法生成访问器接口(visitor interface),语法中的每条规则对应接口中的一个visit方法。图2-6是使用常见的访问者模式对我们的语法分析树进行操作的过程。
2_6
其中,粗虚线显示了对语法分析树进行深度优先遍历的过程。细虚线标示出访问器方法的调用顺序。我们可以在自己的程序代码中实现这个访问器接口,然后调用visit()方法来开始对语法分析树的一次遍历。
s1
ANTLR内部为访问者模式提供的支持代码会在根节点处调用visitStat()方法。接下来,visitStat()方法的实现将会调用visit()方法,并将所有子节点当作参数传递给它,从而继续遍历的过程。或者,visitMethod()方法可以显式调用visitAssign()方法等。
ANTLR会提供访问器接口和一个默认实现类,免去我们一切都要自行实现的麻烦。这样,我们就可以专注于那些我们感兴趣的方法,而无须覆盖接口中的方法。我们将在第7章中深入介绍访问器和监听器。


a3f7e689eba5ae2bd22f3ed88e2d263c32788466

迄今为止,我们已经大体上了解了ANTLR的工作原理。在本章中,我们认识了从字符序列到语法分析树的整个流程,学习了ANTLR运行库的一些关键类。此外,我们还简单了解了监听器和访问器机制,它们是连接语法分析器和特定程序代码的桥梁。在下一章中,我们将通过一个实际的例子来使大家加深对上述概念的理解。
相关文章
|
Linux 网络安全
CentOS 7 SSH连接超时自动断开解决方案
CentOS 7 SSH连接超时自动断开解决方案
1695 0
CentOS 7 SSH连接超时自动断开解决方案
|
机器学习/深度学习 自然语言处理 异构计算
Python深度学习面试:CNN、RNN与Transformer详解
【4月更文挑战第16天】本文介绍了深度学习面试中关于CNN、RNN和Transformer的常见问题和易错点,并提供了Python代码示例。理解这三种模型的基本组成、工作原理及其在图像识别、文本处理等任务中的应用是评估技术实力的关键。注意点包括:模型结构的混淆、过拟合的防治、输入序列长度处理、并行化训练以及模型解释性。掌握这些知识和技巧,将有助于在面试中展现优秀的深度学习能力。
901 11
|
17天前
|
弹性计算 人工智能 运维
阿里云OpenClaw/Hermes Agent搭建全流程:配置百炼Token Plan、一键部署与运维命令大全
OpenClaw(原Clawdbot/Moltbot)与Hermes Agent是当前主流的开源AI智能体框架,可实现自主任务规划、工具调用、代码执行、文件操作、联网检索等复杂能力,是企业与开发者构建自动化工作流、智能助手、运维机器人的核心工具。在阿里云环境中,二者均可通过轻量应用服务器、ECS、计算巢实现一键部署,搭配阿里云百炼Token Plan/Coding Plan,可实现固定额度、成本可控的大模型调用,彻底告别按量付费的账单焦虑,同时享受多模型统一接入、团队共享额度、高并发稳定运行的企业级能力。
324 7
|
1月前
|
人工智能 自然语言处理 安全
阿里云百炼介绍及免费Token领取攻略
阿里云百炼是一站式大模型服务平台,集成Qwen、DeepSeek等百余款多模态模型,支持一键构建AI Agent、RAG知识库与万级并发推理。新用户可免费领取7000万Tokens,90天有效,覆盖文本、图像、代码等场景,零门槛开启AI开发之旅。
1529 14
|
JavaScript 前端开发 API
如何使用Next.js构建应用
【8月更文挑战第4天】如何使用Next.js构建应用
534 2
|
Python
Python pkgutil基础使用说明
pkgutil是Python的标准库中的一个模块,提供了一系列与包(Package)相关的工具函数,例如动态加载包、递归遍历包内的子模块等。在本篇教程中,我们将带你详细了解pkgutil模块的主要功能及使用方法。
487 2
|
编解码 开发工具 C#
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
本文介绍如何利用大牛直播SDK中的轻量级RTSP服务,在Windows平台上轻松采集摄像头数据并生成本地RTSP流。通过SDK提供的SmartPublisherDemo工具,用户能简便地选择摄像头、配置分辨率与帧率,并启动RTSP服务。此外,还支持音频采集、多端口服务以及动态水印等功能。生成的RTSP URL可用于其他终端拉流播放,无需额外部署服务器。该服务适配多种应用场景,如安防监控、电子教室等,并兼容Windows 7及以上版本。对于希望集成此功能的开发者,SDK提供了C++及C#接口,并支持多种编译模式。
1272 0
|
存储 SQL Cloud Native
自研云原生数据仓库AnalyticDB再破权威评测TPC-DS世界纪录!
阿里云自研云原生数据仓库AnalyticDB连续两年成为TPC-DS榜单第一的数据仓库! 性能较前世界纪录提升29%,单位成本仅为其1/3。
4330 0
自研云原生数据仓库AnalyticDB再破权威评测TPC-DS世界纪录!
stm32f407探索者开发板(九)——寄存器地址名称映射
stm32f407探索者开发板(九)——寄存器地址名称映射
361 0
|
移动开发 搜索推荐 前端开发
HTML、XHTML和HTML5系列对比
HTML、XHTML和HTML5系列对比