设计模式学习——解释器模式

探索设计模式的魅力:深入解析解释器模式-学习、实现与高效使用的全指南 深入解析解释器模式:学习、实现与高效使用的全指南,旨在带你全面理解并掌握这一强大的编程设计模式。解释器模式,作为行为设计模式的一种,能够帮助我们为语言创建解释器,用以定义语言的语法和表示,并构建一个解释器来解释语言中的句子。通过学习,你将了解解释器模式的基本概念、应用场景,以及如何将其运用于实际项目中。此外,我们还将详细阐述实现解释器模式的具体步骤和技巧,以及如何高效地使用它来提升代码的可读性、可维护性和可扩展性。无论你是编程初学者还是资深开发者,都能从本指南中获益匪浅。 阅读详情



基本介绍

  1. 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。
  2. 解释器模式(Iterpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
  3. 应用场景
  • 应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
  • 一些重复出现的问题可以用一种简单的语言来表达
  • 一个简单语法需要解释的场景
  1. 这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等。

原理类图

在这里插入图片描述
对原理类图的说明-即(解释器模式的角色及职责)

  1. Context:是环境角色,含有解释器之外的全局信息
  2. AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享
  3. TerminalExpression:为终结符表达式,实现与文法中的终结符相关的解释操作。
  4. NonTermialExpression:为非终结符表达式,为文法中的非终结符实现解释操作
  5. 说明:输入Context 和 TerminalExpression 信息通过Client输入即可

解释器模式的类图实例

在这里插入图片描述

解释器模式的代码实例

/**
 * 抽象类表达式,通过HashMap键值对,可以获取到变量的值
 */
public abstract class Expression {
    //a+b-c
    //解释公式和数值,key 就是公式(表达式)的参数[a,b,c],value就是具体的值
    //HashMap {a=10,b=20}
    public abstract int interpreter(HashMap<String, Integer> var);
}
//变量的解释器
public class VarExpression extends Expression {

    private String key;//key=a,key=b,key=c

    public VarExpression(String key) {
        this.key = key;
    }

    //var 就是{a=10,b=20}
    // interpreter 根据变量名称,返回对应值
    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return var.get(this.key);
    }
}
/**
 * 抽象运算符号解释器  每个运算符号都只和自己左右两个数字有关系,
 * 但左右两个数字有可能也是一个解析的结果,无论何种类型,都是Expression的实现类
 */
public class SymbolExpression extends Expression {

    protected Expression left;
    protected Expression right;

    public SymbolExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    //因为SymbolExpression是让其子类来实现,因此interpreter是一个默认实现
    @Override
    public int interpreter(HashMap<String, Integer> var) {
        return 0;
    }
}
/**
 * 加法解释器
 */
public class AddExpression extends SymbolExpression {
    public AddExpression(Expression left, Expression right) {
        super(left, right);
    }

    //处理相加
    // var 仍然是{a=10,b=20}..
    public int interpreter(HashMap<String, Integer> var) {
        //super.left.interpreter(var):返回left表达式对应的值 a=10
        //super.right.interpreter(var):返回right表达式对应的值 b=20
        return super.left.interpreter(var) + super.right.interpreter(var);
    }
}
public class SubExpression extends SymbolExpression {
    public SubExpression(Expression left, Expression right) {
        super(left, right);
    }

    //求出left和right表达式相减后的结果
    public int interpreter(HashMap<String, Integer> var) {
        return super.left.interpreter(var) - super.right.interpreter(var);
    }
}
public class Calculator {

    //定义表达式
    private Expression expression;

    //构造函数传参,并解析
    public Calculator(String expStr) {
        //安排运算先后顺序
        Stack<Expression> stack = new Stack<>();
        //表达式拆分成字符数组
        char[] charArray = expStr.toCharArray();//[a,+,b]

        Expression left = null;
        Expression right = null;
        //遍历字符数组,即遍历[a,+,b]
        //针对不同的情况,做相应处理
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+':
                    left = stack.pop(); //从stack中取出left => "a"
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new AddExpression(left, right));
                    break;
                case '-':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                default:
                    //如果是一个Var 就创建要给VarExpression对象,并push到stack
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
                    break;
            }
        }
        //当遍历完整个charArray数组后,stack就得到最后Expression
        this.expression = stack.pop();
    }

    public int run(HashMap<String, Integer> var) {
        //最后将表达式a+b和var 绑定{a=10,b=20}
        //然后传递给expression的interpreter进行解释执行
        return this.expression.interpreter(var);
    }
}

客户端

public class Client {

    public static void main(String[] args) throws IOException {
        String expStr = getExpStr();
        HashMap<String, Integer> var = getValue(expStr);
        Calculator calculator = new Calculator(expStr);
        System.out.println("运算结果:" + expStr + "=" + calculator.run(var));
    }

    //获得表达式
    private static String getExpStr() throws IOException {
        System.out.print("请输入表达式:");
        return (new BufferedReader(new InputStreamReader(System.in))).readLine();
    }

    //获得值映射
    private static HashMap<String, Integer> getValue(String expStr) throws IOException {
        HashMap<String, Integer> map = new HashMap<>();
        for (char ch : expStr.toCharArray()) {
            if (ch != '+' && ch != '-') {
                if (!map.containsKey(String.valueOf(ch))) {
                    System.out.println("请输入" + String.valueOf(ch) + "的值:");
                    String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                    map.put(String.valueOf(ch), Integer.valueOf(in));
                }
            }
        }
        return map;
    }
}

解释器模式的注意事项和细节

  1. 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性
  2. 应用场景:编译器、运算表达式计算、正则表达式、机器人等
  3. 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低。
什么是PMOS?什么是NMOS?两者有什么区别? 这个电压差被称为阈值电压(Vth),通常为0.7V至2V(低压NMOS)或4V至10V(功率NMOS)。当Vgs(栅极-源极电压)大于Vth时,沟道中的电子被吸引到栅极下方,形成导电通路,使电流可以从漏极流向源极。NMOS与PMOS的结构类似,都由三大部分组成:栅极(Gate)、源极(Source)和漏极(Drain)。由于NMOS在开启时,电子是主要的载流子,电子的迁移率比空穴高,因此NMOS通常具有更低的导通电阻(Rds(on)),这使其成为高速开关电路中的首选。它的沟道由电子(负载子)传导。 阅读详情

相关推荐

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 530

第 23 章 解释器模式

第 23 章 解释器模式 1、四则运算问题 通过解释器模式来实现四则运算,如计算a+b-c的值,具体要求 先输入表达式的形式,比如 a+b+c-d+e,要求表达式的字母不能重复 在分别输入 a, b, c, d, e 的值 最后求出结果:如图 2、传统方案解决四则运算问题分析 编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果 问题分析:如果加入新的运算符,比如 ‘*’、’/’ ( 等等,不利于扩展, 另外让一个方法来解析会造成程序结构混乱,不够清晰 解决方案:可以考虑使用解释

Oneby的博客 441

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

设计模式——解释器模式

解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例。这里我们将语言理解成使用规定格式和语法的代码解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中,它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。例如我们经常利用正则表达式检测某些字符串是否符合我们规定的格式。

meser88的博客 631

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 519

EGO_Planner代码学习(三):px4ctrl代码流程

上节阅读了EGO_Planner的轨迹服务器部分的代码,其实质是将规划器生成的轨迹进行离散化,间隔10ms计算当前时刻在轨迹上的位置,并发送到话题上。这两天抽空看了下控制器部分的代码,在l这个软件包里,它的功能是进行px4的模式识别和上层控制,通过线性控制器把发布过来的位置命令解算成飞控的控制量,通过mavros发送给px4。下面就详细看一下它的启动过程。

qq_41069236的博客 6805

25. Spring源码篇之SpEL表达式

Language)表达式简称SpEL表达式,该功能在Spring中实现还是比较复杂,在Spring中单独有一个模块spring-expression来实现,所以本文主要看一小部分的源码,大概知道怎么使用就行了。

shura1014的博客 614

ESP32-C61 eFuse控制器深度解析:寄存器架构与安全烧写实践

eFuse(电子熔丝)是嵌入式芯片实现硬件级不可逆配置与信任根构建的核心物理机制,其本质是通过电学编程固化关键安全参数。原理上依赖熔丝单元的单向导通/断开特性,结合Reed-Solomon纠错、多级写保护和时序可控编程,保障数据在宽温域与工艺偏差下的高可靠性。技术价值在于为Secure Boot、Flash加密、密钥隔离等安全功能提供可信锚点,支撑从启动到运行的全链路防护。典型应用场景涵盖物联网设备量产烧录、安全启动使能、MAC地址固化及抗DPA密码运算配置。本文聚焦ESP32-C61平台,深入解析其eFu

weixin_42589700的博客 123

解释器模式

解释器模式

Charge8的博客 1006

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4371

23种设计模式之解释器模式(Interpreter Pattern)

本篇文章将23种设计模式中的解释器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

手把手教您如何群晖/飞牛NAS等服务器上一键部署洛雪音乐同步服务,手机电脑无缝同步歌单,支持外网访问

🎵 手机电脑歌单不同步?用Docker在群晖/飞牛NAS等服务器上搭个同步服务器, 3分钟搞定 !支持docker-compose一键部署,手机、电脑、平板收藏夹实时同步,外出也能用域名远程访问 ~ ✨

XiaoqiangClub的博客 4605

认真学习设计模式之解释器模式(Interpreter Pattern)

# 【1】概述 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。 解释器模式(Interpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)。 **应用场景** * 应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树 * 一些重复出现的问题可以用一种简单的语言来表达 * 一

小小默:进无止境 1791

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

尚硅谷设计模式学习(21)---[解释器模式(Interpreter Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 解释器模式 给定语言(表达式),定义它的表示,并定义解释器,使用该解释器来解释语言中的句子(表达式). Context可以包含解释器之外的其他数据信息. 缺点:解释器模式会引起类膨胀;采用递归调用方法,将会导致调试非常复杂;效率降低 简易计算器案例 抽象的表达式类AbstractExpression /** * @author by 优快云@小智RE0 */

从零开始的异世界JAVA学习 280

学习笔记【23种设计模式-第二十节:Interpreter Pattern解释器模式】

Interpreter Pattern 解释器模式 简述 在编译原理中,一个算术表达式通过词法分析器形成此法单元,而后这些词法大院再通过语法分析器构建语法分析树,最终形成一棵抽象的语法分析树。这里的语法分析器和词法分析器都可以看作是解释器。 解释器模式:是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个计时器,使用该解释器来解释语言中的句子(表达式)。 应用场景:一、应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。二、一些重复出现的问题可以用一种简单的语言来表达。三、一个简单语法

qq_53273362的博客 166

设计模式学习(二十二):解释器模式

实际上,我们可以把自定义的告警规则,看作一种特殊“语言”的语法规则。我们实现一个解释器,能够根据规则,针对用户输入的数据,判断是否触发告警。一般来讲,监控系统支持开发者自定义告警规则,比如我们可以用下面这样一个表达式,来表示一个告警规则,它表达的意思是:每分钟 API 总出错数超过 100 或者每分钟 API 总调用数超过 10000 就触发告警。除此之外,用户可以自定义要监控的 key,比如前面的 api_error_per_minute、api_count_per_minute。这五个运算符,其中,

Practitioner 481

java设计模式学习之【解释器模式】

这篇教程不仅提供了解释器模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1391

学习设计模式《二十》——解释器模式

解释器模式的本质是【分离实现,解释执行】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1108

23种设计模式学习记录之解释器模式

想说的话: 在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vue。毕业两年后去面试,发现设计模式还是java程序员需要迈过的一道坎,面试的时候问到代理模式和适配器模式有什么区别,你在工作中用到了什么设计模式,怎么用的?答不上来的特别尴尬,所以决定重新学习这几种设计模式,争取在工作中使用上。 本文所有案例代码 码云:https://gitee.com/helloworld6

lx9876lx的博客 192

设计模式学习—23解释器模式

解释器模式 文章目录解释器模式UML解释说明代码实现参考资料 UML 解释说明 解释器模式:给定一个语言,定义它的文法中的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 如果一种特定类型的问题发生频率足够高,那么就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。 不足:解释器模式为文法中的每一条规则至少定义...

Abfahrt的博客 207

解释器模式 - 设计模式学习

解释器模式 - 设计模式学习   解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。   解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该...

212

学习笔记(26):第2章 架构师内功心法之设计模式 -解释器模式详解

不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的是解耦。设计模式天天都在用,但自己却无感知。 我们把设计模式作为一个专题,主要是学习设计模式是如何总结经验的,把经验为自己所用。学设计模式也是锻炼将业务需求转换技术实现的一种非常有效的方式。 本章内容将按照创建型模式(工厂方法模式、抽象工厂模式、单例模式、原型模式、建造者模式)、结构...

qq_28500837的博客 152

设计模式之解释器模式的学习思考

解释器模式,就跟它的名字一样,起到解释的作用,比如对一个表达式进行解释,使其能够被人们所理解,属于设计模式里的行为型模式一种这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。优点: - 可扩展性比较好,灵活。 - 增加了新的解释表达式的方式。 - 易于实现简单文法。缺点: - 可利用场景比较少。 - 对于复杂的文法比较难维护。 -

L-Study 368

学习札记:设计模式之解释器模式

文章目录一.什么是解释器模式二.解释器模式的写法 一.什么是解释器模式 给定一个语言,定义文法表示,并定义一个解释器去解释定义的句子。 二.解释器模式的写法 ...

android_seven的博客 300

设计模式学习-解释器模式

解释器模式 解释器模式用于对某种特定的语句进行分析和执行,当我们需要使用一些简单的语句来实现特定的操作的时候,只需要输入按照语言规则编写的语句,那么通过解释器模式可以按照预先定义的规则进行解析和执行。 定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解析语句中的句子。 结构 AbstractExpression抽象表达式。终结符表达式和非终结符表达式的父类,定...

谢谢谢谢呵的博客 190

Java学习-设计模式-解释器模式

Java学习-设计模式-解释器模式 概述: 解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。 缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。...

xxydzyr的博客 201
上一篇: 设计模式学习——备忘录模式
下一篇: 设计模式学习——状态模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值