热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在使用访问者模式时,如何在树中传递结构(即继承的属性)?

如何解决《在使用访问者模式时,如何在树中传递结构(即继承的属性)?》经验,为你挑选了1个好方法。

我正在使用C++版本的ANTLR4为音乐产品开发DSL.我曾经(30年前!)手工做这种事情所以很高兴有一些像ANTLR这样的东西,特别是现在我不必在实际的语法定义中插入代码.

我想在函数调用中对实际与正式args进行类型检查.在下面的语法段中,'actualParameter'可以返回表达式的类型.但是,'actualParameterList'需要返回这些类型的数组(例如),以便functionCall的代码可以与形式参数列表进行比较.

如果我手写这个,那么访问或visitChildren的调用将在上下文之后获取额外的参数,这样我可以在适当的位置创建一个新数组,然后让子节点填充详细信息.

我想,不是只是在'visitActualParameterList'中调用visitChildren,我可以在那里创建数组并手动调用每个子进程,而不仅仅是一个简单的visitChildren,但这感觉就像一个hack,并且它对语法中的微小变化变得非常敏感.

有更好的方法吗?

functionCall: Identifier LeftParen actualParameterList? RightParen
;

actualParameterList:
   actualParameter anotherActualParameter
;

actualParameter:
   expression 
;

anotherActualParameter:
  Comma actualParameter anotherActualParameter
|
;   

TomServo.. 11

你走在正确的道路上.我会建议像:

functionCall: Identifier LPAREN actualParameterList RPAREN
;

actualParameterList:
    actualParameter (',' actualParameter)*
;

actualParameter:
   expression 
;

LPAREN : '(';
RPAREN : ')';

使用此功能,在访问者中,actualParameterList您可以检查每个孩子是否属于类型actualParameterContext,如果是,请明确调用该孩子的访问,这将使您进入表达式评估代码(可能在访问者中处理actualParameter).正如你所说,这可以减少一般性地探望儿童的需要.当你可以检查这样的类型时,它非常精确.

这是我自己的代码中的这种模式的一个例子(在C#中,但你肯定会看到模式在运行):

for (int c = 0; c 

现在您可以看到模式,返回到您的代码.语法:

actualParameter (',' actualParameter)*

表示参数列表中有一个参数列表actualParameter后跟零个或多个附加的*操作符.为了清晰起见,我只是把逗号放在那里.

正如您所建议的,访问者是完美的模式,因为您可以明确访问您需要的任何节点.它不会你一个数组,但你可以填充一个数组或任何其他必要的结构与访问孩子的结果,就像你在我的代码的剪辑中看到的那样.我的访问者返回字符串,我只是附加到StringBuilder.您可以使用相同的模式来构建您需要的任何内容.



1> TomServo..:

你走在正确的道路上.我会建议像:

functionCall: Identifier LPAREN actualParameterList RPAREN
;

actualParameterList:
    actualParameter (',' actualParameter)*
;

actualParameter:
   expression 
;

LPAREN : '(';
RPAREN : ')';

使用此功能,在访问者中,actualParameterList您可以检查每个孩子是否属于类型actualParameterContext,如果是,请明确调用该孩子的访问,这将使您进入表达式评估代码(可能在访问者中处理actualParameter).正如你所说,这可以减少一般性地探望儿童的需要.当你可以检查这样的类型时,它非常精确.

这是我自己的代码中的这种模式的一个例子(在C#中,但你肯定会看到模式在运行):

for (int c = 0; c 

现在您可以看到模式,返回到您的代码.语法:

actualParameter (',' actualParameter)*

表示参数列表中有一个参数列表actualParameter后跟零个或多个附加的*操作符.为了清晰起见,我只是把逗号放在那里.

正如您所建议的,访问者是完美的模式,因为您可以明确访问您需要的任何节点.它不会你一个数组,但你可以填充一个数组或任何其他必要的结构与访问孩子的结果,就像你在我的代码的剪辑中看到的那样.我的访问者返回字符串,我只是附加到StringBuilder.您可以使用相同的模式来构建您需要的任何内容.


这个答案正在讨论[关于meta](https://meta.stackoverflow.com/q/350371/962603).
是的,正如我在我的问题中提到的,我已经认为我可以通过明确检查和访问适当的孩子来做到这一点.但这种方法对我来说是错误的.特别是,在这种特殊情况下,这并不是什么大问题,因为只有一个级别的"孩子"需要检查.更复杂的示例可能需要更深的树.必须从"顶部"操纵它需要深入了解结构的全局知识.这反对能够传递一个属性(在这种情况下是一个数组)DOWN树,其中每个叶子(或子树)可以在本地做事.
推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
author-avatar
转化术治_953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有