设计模式:解释器模式

2023-11-02

定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。

类型:行为类模式

类图

解释器模式是一个比较少用的模式,本人之前也没有用过这个模式。下面我们就来一起看一下解释器模式。

解释器模式的结构

  • 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。
  • 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。                                
  • 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
  • 环境角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

代码实现

class Context {}
abstract class Expression {
	public abstract Object interpreter(Context ctx);
}
class TerminalExpression extends Expression {
	public Object interpreter(Context ctx){
		return null;
	}
}
class NonterminalExpression extends Expression {
	public NonterminalExpression(Expression...expressions){
		
	}
	public Object interpreter(Context ctx){
		return null;
	}
}
public class Client {
	public static void main(String[] args){
		String expression = "";
		char[] charArray = expression.toCharArray();
		Context ctx = new Context();
		Stack<Expression> stack = new Stack<Expression>();
		for(int i=0;i<charArray.length;i++){
			//进行语法判断,递归调用
		}
		Expression exp = stack.pop();
		exp.interpreter(ctx);
	}
}

文法递归的代码部分需要根据具体的情况来实现,因此在代码中没有体现。抽象表达式是生成语法集合的关键,每个非终结符表达式解释一个最小的语法单元,然后通过递归的方式将这些语法单元组合成完整的文法,这就是解释器模式。

解释器模式的优缺点

解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。

但是,解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。同时,由于采用递归调用方法,每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,必须通过递归方式,无论是面向对象的语言还是面向过程的语言,递归都是一个不推荐的方式。由于使用了大量的循环和递归,效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。

解释器模式的适用场景

在以下情况下可以使用解释器模式:

有一个简单的语法规则,比如一个sql语句,如果我们需要根据sql语句进行rm转换,就可以使用解释器模式来对语句进行解。

一些重复发生的问题,比如加减乘除四则运算,但是公式每次都不同,有时是a+b-c*d,有时是a*b+c-d,等等等等个,公式千变万化,但是都是由加减乘除四个非终结符来连接的,这时我们就可以使用解释器模式。

注意事项

解释器模式真的是一个比较少用的模式,因为对它的维护实在是太麻烦了,想象一下,一坨一坨的非终结符解释器,假如不是事先对文法的规则了如指掌,或者是文法特别简单,则很难读懂它的逻辑。解释器模式在实际的系统开发中使用的很少,因为他会引起效率、性能以及维护等问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式:解释器模式 的相关文章

  • 计算机技术为我们带来的影响,计算机技术对社会发展的影响探析

    摘 要 随着社会科学技术和经济的迅速发展 计算机技术也越来越完善 对人类生活的影响也越来越显著 计算机的应用领域很大 几乎可以被用在人们生活的方方面面 无论是学习 工作 还是生活 娱乐 都能看到计算机技术为我们提供的方便之处 正是因为计算机
  • 【论文笔记】BLIP: Bootstrapping Language-Image Pre-training forUnified Vision-Language Understanding and

    1 背景 1 1 之前存在的两个问题 1 模型视角 大多数方法要么采用基于编码器的模型 要么采用编码器 解码器模型 基于编码器的模型不太容易直接转移到文本生成任务 例如 图像字幕 而编码器 解码器模型尚未成功用于图像文本检索任务 2 数据集
  • GoShoppingActivityLearnBinding.java:918: 错误: 参数过多 protected GoShoppingActivityLearnBinding

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 工作中遇到的问题 使用DataBinding 报参数过多 编译失败 异常截图如下 问题解决方法 探索 当时
  • Camera SPI协议讲解

    Camera SPI协议讲解 该文章写于2016年 一直未发表 近期工作中又涉及到了Camera相关的内容 重新温习了下相关知识 决定把这篇文章发表出来 大家共同学习 SPI Serial Peripheral Interface 串行外围
  • ‘cmake' 不是内部或外部命令 也不是可运行的程序 或批处理文

    在 Win7下的命令行模式下 输入cmake相关命令 出现如下错误 cmake 不是内部或外部命令 也不是可运行的程序 或批处理文件 解决方法 在环境变量中添加cmake的文件路径 计算机 右键 属性 高级系统设置 高级 环境变量 系统变量
  • pytorch 多GPU训练总结(DataParallel的使用)

    参考 主页 PyTorch中文文档 前言 博主最近搭建网络的时候 需要调用不同的GPU 实现训练的加速 有时间会出现显卡现存分布不均的情况 有时间有的显卡温度特别高 博客持续更新 一更 2022 09 01 DP模式见本文 使用最少的代码实
  • Go语言上手-实战案例(1)

    猜谜游戏 在这个游戏里面 程序首先会生成一个介于1 100之间的随机整数 然后提示玩家进行猜测 玩家每次输入一个数字 程序就会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数 并且让玩家再次猜测 如果猜对了就告诉玩家胜利并且退出程序 生成
  • 搜索神器Everything的功能技巧(非NTFS文件搜索,FTP/HTTP服务)

    Everything这个搜索神器估计大家都听过 磁盘上的任何文件只要输入后基本就是秒搜 但Everything除了搜索 还自带了一些好用的功能 1 添加非NTFS格式的驱动器索引 默认Everything只会索引查询本地的NTFS格式磁盘
  • Linux云计算命令大全

    云计算命令总结 一 系统命令精讲 二 目录和文件管理 三 安装及管理程序 四 账号管理 五 权限及归属管理 六 磁盘管理 七 文件系统与LVM 八 服务器RAID及配置实战 九 引导过程与服务控制 十 进程和计划任务管理 十一 系统安全及应
  • 【linux】nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module

    1 概述 我使用 Linux centos8 安装nginx详细步骤 这个安装了一个nginx 然后启动如下 root zdh2 nginx 1 18 0 sudo usr local nginx sbin nginx c usr

随机推荐

  • class与prototype

    创建实例对象 ES5中常用的构造函数模式 function Person name this name name this getName function return this name ES6 通过class定义类 class Per
  • selenium处理登陆爬虫(维持登陆状态请求页面)

    selenium在处理需要登陆的时候 需要修改浏览器请求头参数cookie或token 在请求需要登陆的页面时 添加参数 跳过登陆 直接获取登陆后的内容 直接在driver对象内添加cookie参数绕开登陆 处理思路 浏览器先登陆 请求同一
  • umi如何实现鉴权

    什么是jwt鉴权 JWT JSON Web Token 本质就是一个字符串书写规范 作用是用来在用户和服务器之间传递安全可靠的信息 在目前前后端分离的开发过程中 使用token鉴权机制用于身份验证是最常见的方案 流程如下 服务器当验证用户账
  • 2.查询分离:表数据量大读写缓慢如何优化?

    查询分离 表数据量大读写缓慢如何优化 01 讲中我们提到过 冷热分离解决方案的性价比高 但它并不是一个最优的方案 仍然存在诸多不足 比如 查询冷数据慢 业务无法再修改冷数据 冷数据多到一定程度系统依旧扛不住 我们如果想把这些问题一一解决掉
  • 如何设置电脑永不熄屏

    1 win q调出搜索框 输入系统 点击系统 2 电源和睡眠 两个选项改为从不 如果是虚拟机 设置永不熄屏的方法 设置
  • 猿创征文

    文章目录 1 PolarDB X是什么 2 PolarDB X架构 3 PolarDB X架构优势 4 PolarDB X核心特性 5 PolarDB X部署 5 1 通过PXD部署集群 5 2 通过 K8S 部署 5 3 通过编译安装 1
  • 【Mybatis-puls 】返回map下划线自动转成驼峰

    文章目录 问题描述 1 yml配置解决方案 错误分析 解决方案 转换器代码 ConfigurationPropertiesBinding的作用 2 通过Java配置bean解决 觉得第一种麻烦的直接用第二种 问题描述 VO实体类自动转换驼峰
  • 使用plsql工具查看oracle中的blob字段的可视化值

    SELECT utl raw cast to varchar2 dbms lob substr t detailsql from Voucher t
  • 每天一个设计模式——装饰模式(C++实现)

    设计模式的代码十分难写的 要充分的体现可复用性 网上有着大量关于设计模式的代码 其中很多的代码违背了很多设计原则 比如依赖倒置原则 开放封闭原则 需要我们明辨是非 设计模式的原则大于使用哪个设计模式 类的组合关系也大于类的继承 通过不断的写
  • ECCV 2022

    作者 机器之心编辑部 来源 机器之心 如何将现有的图像 文本多模态大模型 例如 OpenAI CLIP 用于视频内容理解 是一个非常实用且具有前景的研究课题 它不仅可以充分挖掘图像大模型的潜力 还可以为视频大模型的设计和研究铺平道路 在视频
  • 年轻人还记得KCP吗?什么是KCP,怎么使用呢!!!

    一 什么是KCP KCP是一种网络传输协议 A Fast and Reliable ARQ Protocol 可以视它为TCP的代替品 但是它运行于用户空间 它不管底层的发送与接收 只是个纯算法实现可靠传输 它的特点是牺牲带宽来降低延迟 因
  • C51单片机学习笔记(二)——花样流水灯的实现

    C51单片机学习笔记 二 花样流水灯的实现 文章目录 C51单片机学习笔记 二 花样流水灯的实现 1 单片机引脚 晶振 复位的作用 2 流水灯原理图 3 单片机的周期 4 延时函数的编写 5 使用 位操作 控制流水灯 6 使用字节控制 并行
  • lenovo联想笔记本ThinkBook 14 Gen5+ IRH(21HW)原装Win11系统镜像原厂OEM恢复出厂状态

    LENOVO联想笔记本电脑 ThinkBook 14 Gen5 IRH 21HW 原厂Windows11原装OEM系统 恢复出厂时状态系统 系统自带所有驱动 出厂主题壁纸LOGO Office办公软件 联想电脑管家等预装程序 所需要工具 1
  • java客户端作为kafka消费者测试

    README 本文主要对 java客户端作为kafka 消费者进行测试 生产者由 kafka客户端扮演 1 普通消费者 设置消费者组 重置消费者的offset 即每次都从最头开始消费 默认仅保持7天内数据 类似于 命令行 from begi
  • 【node.js】Node.js下载安装(在vscode中使用)01

    博 主 初映CY的前说 个人信条 想要变成得到 中间还有做到 本文核心 Node js的下载安装操作 目录 一 node介绍 二 node js下载安装 一 node介绍 Node js是一个Javascript运行环境 runtime 实
  • Java句柄与指针

    java中的句柄分为两种 对象句柄 jvm中对象访问句柄 一 对象句柄 句柄 一个唯一的整数 作为对象的身份id 区分不同的对象 和同类中的不同实例 程序可以通过句柄访问对象的部分信息 句柄不代表对象的内存地址 在Java中的任何东西都可以
  • mysql 用户量,MySQL ── 用户数全球排名第一的免费开源关系型数据库

    MySQL 是一种关联数据库 关联数据库会将数据保存在不同表中 而不是将所有数据放在一个大仓库内 这样就增加了速度并提高了灵活性 MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言 MySQL 软件采用了双 授权政策 社区
  • 打开qt文件报“could not decode ... with “UTF-8“ -encoding” Editting not possible

    从别人那拷来的qt程序 报错如下 深入解决不能在文件编辑中切换中文输入的问题 仔细按照以下三步操作 可以解决 1 点击 Select Encoding 按编码重新载入GB2312格式或者GBK 虽然能编辑代码但仍不能切换中英文输入 此时 应
  • 使用ftp实现windows和ios的公网文件夹共享

    请注意 本文主要研究的是如何实现在公网环境下 即电脑和ipad或iPhone设备不在同一网络下 实现文件夹共享 如果你想实现的仅仅是局域网间的文件夹共享 可以参考博客使用SMB和ipad自带的文件app实现 操作简单实现快ipad和wind
  • 设计模式:解释器模式

    定义 给定一种语言 定义他的文法的一种表示 并定义一个解释器 该解释器使用该表示来解释语言中句子 类型 行为类模式 类图 解释器模式是一个比较少用的模式 本人之前也没有用过这个模式 下面我们就来一起看一下解释器模式 解释器模式的结构 抽象解