JAVA设计模式(15)-解释器模式

2023-11-05

定义:

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

类型:

行为类模式

类图:
这里写图片描述

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

解释器模式的结构

抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个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-cd,有时是ab+c-d,等等等等个,公式千变万化,但是都是由加减乘除四个非终结符来连接的,这时我们就可以使用解释器模式。

注意事项

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

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

JAVA设计模式(15)-解释器模式 的相关文章

  • prometheus 添加 login 登录认证界面(nginx + flask 实现)

    前言 prometheus是现在一个比较主流的监控软件 随着容器的普及 prometheus的应用越来越广泛 前面我也有专门讲到prometheus的相关文章 但是跟传统老牌的zabbix监控不一样 prometheus的web UI是没有
  • 从计算机中删除勒索软件的 6 种方法

    勒索软件是一种恶意软件 它会加密计算机上的文件 然后要求付费才能解密它们 对于企业主和个人来说 这可能是一个非常头疼的问题 未能删除勒索软件可能会导致永久性数据丢失 有些信息对企业至关重要 应不惜一切代价防止丢失或损坏 有几种方法可以删除它
  • ajax.parse,GitHub - srhyne/jQuery-Parse: An AJAX wrapper for the Parse.com REST API

    What is it It s a super light weight AJAX wrapper for Parse com s wonderful database service Why did you build it I want
  • 源码学习时间,Window Manager in Android

    今日科技快讯 近日消息 京东百亿补贴被曝已开始少量上线测试 已有用户可看到活动页面 据网友反馈 京东部分商品现已有 百亿补贴 的标签 目前上线的商品包括手机 家电 酒水 食品 服饰等众多品类 作者简介 大家周五好 咱们下周再见 祝大家周末愉
  • vue封装全局loading

    首先创建一个loading文件
  • 运算放大器(运放)介绍

    注意 此处我们采用的是Multisim软件仿真 链接中有详细安装教程 注意 仿真只是数学运算 实际情况的话 就不是数学运算那么简单 有很多复杂的因数在里面 所以具体情况要参照实际电路搭建 比如说 之前我们搭建蔡氏电路的时候 明明1700欧左

随机推荐

  • TCP/IP超详细总结

    网络的基础知识 一 协议 1 简介 在计算机网络与信息通信领域里 人们经常提及 协议 一词 互联网中常用的具有代表性的协议有IP TCP HTTP等 而LAN 局域网 中常用的协议有IPX SPX 等 下面通过通俗一点的方式来解释一下协议
  • 2021-11-01 B1016 关于数字位处理

    B1016刷题 很好 再次格局小了 有被气到 原思路 先把数字从后往前模出个位数来 再依次和要查找的数字比对 关键来了 比对完之后要加一位数嘛 我走了两条歪路 第一条 得出一次相等就把计数的count加一 同时用一个数组p count 存放
  • 解决Linux系统中netWork重启不了

    1 查看主机地址 ip addr link other 后既是主机地址 修改 etc sysconfig network scripts ifcfg ens33 查看HWADDR地址 如果没有 添加 如果和ip addr一致 问题解决 2
  • Android Gradle 7.x升级指南

    最近 升级了一下Android项目的Gradle和targetSdkVersion 本文以升级targetSdkVersion 33和Gradle 7 2进行说明 一 升级targetSdkVersion 首先 我将compileSdkVe
  • 操作系统(1) - 死锁的四个必要条件及避免

    一 什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局 互相等待 若无外力作用 这些进程都将无法向前推进 二 死锁产生的原因 1 系统资源的竞争 系统资源的竞争导致系统资源不足 以及资源分配不当 导致死锁 2 进程运行推进顺序不合适 进
  • 网络优化的指标

    延迟 延迟指的是IP数据包从一个网络端点到另一个网络端点所花费的时间 RTT 往返协议 制约Web性能的主要瓶颈 带宽 两个网络端点之间的连接会一次处理尽可能多的数据量 DNS查询 建立连接的时间 TLS协商时间 首节字节时间 TTFB 指
  • securecrt从服务器获取文件夹,在SecureCRT屏幕下获取数据并存至文件中

    在SecureCRT屏幕上获取数据并存至文件中 在CRT屏幕上获取某个具体位置的文本 可以使用Screen 对象的Get or Get2 方法去获取屏幕上的数据 1 Get 函数包含四个参数 文本第一个字符所在的行号 列号 最后个字符所在的
  • C语言学习路线图 #CSDN博文精选# #IT技术# #C语言# #学习路线# #系统化学习#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • Docker-compose安装

    docker compose docker compose是用于定义和运行多容器docker应用程序的工具 compose 通过一个配置文件来管理多个docker容器 可以使用docker compose yml脚本来启动 停止 重启应用
  • 如何编写测试用例

    用例的五个构成元素 下面从这五个元素的角度 去剖析如何编写测试用例 用例标题 用例标题就是测试点名称 用例标题是用来说明这个用例的测试目的的 好的用例标题是别人看完你这个用例标题后就知道你这个用例是测什么的 但并不是标题越详细越好 既然是标
  • Cdiak

    include
  • 多模态超省钱!JinaChat 面向开发者的大模型服务

    2023年6月25日 Jina AI 发布了 JinaChat 一个面向开发者和终端用户的多模态大模型API 传统大型语言模型往往将竞争力建立在 参数多 和 刷分强 的基础上 然而对于应用开发者来说 传统模型商的 API 并不能很好地让开发
  • STM32F4驱动42步进电机(采用驱动器)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 器件 实物 接线 TB6600拨码卡关 代码说明 main c 代码如下 示例 main c 代码 极简版 step motor c 代码如下 示例 step mo
  • 机票票面各项内容详解

    ALLOW 或 BAG 说明免费托运行李的限制 记重或记件 例如印 20K 就表示限带 20公斤 超重部分运费还要另计 一般经济舱每人限重为 20 公斤 相关内容见 行李规定 BOOKING REF 订票代号 CARRIER 表示 航空公司
  • Nginx启动,重启以及基本命令

    1 启动nginx 进入nginx安装目录执行 sbin nginx c conf nginx conf 2 验证nginx配置文件是否正确 方法1 进入nginx安装目录sbin下 输入命令 nginx t 回显test is succe
  • ubuntu工具列表

    微信 GitHub zq1997 deepin wine deepin源移植 Debian Ubuntu上最快的QQ 微信安装方式 FileZilla ftp sftp连接服务器 Ubuntu18 04安装FileZilla ubuntu安
  • 程序设计之归并排序

    6 86 归并排序 10 分 本题要求实现二路归并排序中的归并操作 待排序列的长度1 lt n lt 1000 函数接口定义 void Merge SqList L int low int m int high 其中L是待排序表 使排序后的
  • 阿里前端开发工具Weex安装学习

    支持原创 更多内容欢迎关注作者博客 http www china10s com blog p 314 移动互联网的开发方式 最开始的手机厂商定制版的封闭系统开发 到后来智能机出现之后 Android和iOS异军突起 形成了两大独立的阵营 这
  • Table is marked as crashed and should be repaired 解决办法

    遇到这个问题几个敲命令轻松搞定 1 首先进入mysql命令台 mysql u root p 回车 输入密码 2 查询所有的库 mysql gt show databases 3 进入数据库 eduyun 2015 sp1 是库名 mysql
  • JAVA设计模式(15)-解释器模式

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