当前位置: 首页 > news >正文

笨蛋学设计模式行为型模式-解释器模式【23】

行为型模式-解释器模式

    • 8.10解释器模式
      • 8.10.1概念
      • 8.10.2场景
      • 8.10.3优势 / 劣势
      • 8.10.4解释器模式可分为
      • 8.10.5解释器模式
      • 8.10.6实战
        • 8.10.6.1题目描述
        • 8.10.6.2输入描述
        • 8.10.6.3输出描述
        • 8.10.6.4代码
      • 8.10.7总结

8.10解释器模式

8.10.1概念

​ 解释器模式用于定义一个语言的文法规则,并解释和执行该语言中的表达式。它通过将语言表达式表示为一个抽象语法树,并提供解释器来遍历和执行该语法树,从而实现对语言的解释和执行

8.10.2场景

​ 例如编译器将源代码作为输入,通过词法分析和语法分析,构建抽象语法树(AST)。然后编译器使用解释器模式来遍历和执行这个抽象语法树,将源代码转换为机器码,并执行该机器码。

8.10.3优势 / 劣势

  • 抽象语法树使得算法独立于语法:抽象语法树作为构建解析器的结构,使得解析器的结构和实现与输入的文本语法无关
  • 易于单独扩展:由于解析器和语法规则分别通过抽象语法树和上下文无关文本来表示,因此易于单独扩展

  • 抽象语法树复杂:若语法规则非常复杂,抽象语法树可能会变得非常大和复杂,可能导致解析器实现和维护变得困难
  • 性能不如基于字符的解析器:由于抽象语法树和上下文无关文本都需要存储和解析

8.10.4解释器模式可分为

  • 抽象表达式AbstractExpression:定义了解释器的接口,包含了解释器的方法interpret
  • 终结符表达式TerminalExpressio:在语法中不能再分解为更小单元的符号
  • 非终结符表达式Non-terminalExpression:文法中的复杂表达式,它由终结符和其他非终结符组成
  • 上下文Context:包含解释器之外的一些全局信息,可以存储解释器中间结果,也可以用于向解释器传递信息

8.10.5解释器模式

package com.technologystatck.designpattern.mode.interpreter;public class Interpreters {public static void main(String[] args) {Context context = new Context();Expression expression = new AddException(new TerminalExpression(1), new TerminalExpression(2));int resulult = expression.interpret();System.out.println("Result:"+resulult);System.out.println("Context的全局变量:"+Context.CONTEXTSTR);}
}//创建抽象表达式接口:定义解释器的接口,
//声明一个interpret方法,用于解释语言中的表达式
//抽象表达式接口
interface Expression {int interpret();
}//创建具体的表达式类:实现抽象表达式接口,
//用于表示语言中的具体表达式
class TerminalExpression implements Expression{private int value;public TerminalExpression(int value) {this.value = value;}@Overridepublic int interpret() {return value;}
}//非终结符表达式:抽象表达式的一种,
//用于表示语言中的非终结符表达,通常包含其他表达式
class AddException implements Expression{private Expression left;private Expression right;public AddException(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret() {return left.interpret()+right.interpret();}
}//上下文:包含解释器需要的一些全局信息或状态
class Context{//可以在上下文中存储一些全局信息或状态public static final String CONTEXTSTR="contextStr";
}

8.10.6实战

8.10.6.1题目描述

小明正在设计一个计算器,用于解释用户输入的简单数学表达式,每个表达式都是由整数、加法操作符+、乘法操作符组成的,表达式中的元素之间用空格分隔,请你使用解释器模式帮他实现这个系统。

8.10.6.2输入描述

每行包含一个数学表达式,表达式中包含整数、加法操作符(+)和乘法操作符(*)。 表达式中的元素之间用空格分隔。

8.10.6.3输出描述

对于每个输入的数学表达式,每行输出一个整数,表示对应表达式的计算结果。

8.10.6.4代码
package com.technologystatck.designpattern.mode.interpreter;import java.util.Scanner;
import java.util.Stack;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);Context context = new Context();//处理用户输入的数学表达式while (scanner.hasNextLine()) {String userInput = scanner.nextLine();Expression expression = parseExpression(userInput);if (expression != null) {//将表达式入栈context.pushExpression(expression);System.out.println(expression.interpret());} else {System.out.println("Invalid expression.");}}}//用于解析用户输入的数学表达式并返回相应的抽象表达式类private static Expression parseExpression(String userInput) {try {//定义一个表达式栈Stack<Expression> expressionStack = new Stack<>();//将用户输入的字符串转换为字符数组,方便处理。char[] tokens = userInput.toCharArray();//随意设置一个符号,//主要判断有没有识别进正确的+、*char operator='!';//遍历字符数组,处理字符串。for (int i = 0; i < tokens.length; i++) {char token = tokens[i];if (Character.isDigit(token)) {//将数字传入进去expressionStack.push(new NumberExpression(Character.getNumericValue(token)));//若栈中有两个以上的元素,说明可以进行运算if (i + 1 <= tokens.length && expressionStack.size() >= 2) {Expression right = expressionStack.pop();Expression left = expressionStack.pop();//若有匹配上的,则直接入栈if (operator == '+') {expressionStack.push(new AddException(left, right));} else if (operator == '*') {expressionStack.push(new MulException(left, right));}else{System.out.println("符号有误");}i++; //跳过下一个字符,因为已经处理过了}}else{//若不为数字,就进入这里,将符号赋给操作变量operator=token;}}//返回最后一个元素,即最终的表达式。return expressionStack.pop();} catch (Exception e) {return null;}}
}//创建抽象表达式接口
interface Expression {int interpret();
}//创建终结符表达式类,实现抽象表达式接口
class NumberExpression implements Expression {private int number;public NumberExpression(int number) {this.number = number;}@Overridepublic int interpret() {return number;}
}//创建非终结符表达式加法
class AddException implements Expression {private Expression left;private Expression right;public AddException(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret() {return left.interpret() + right.interpret();}
}//创建非终结符表达式乘法
class MulException implements Expression {private Expression left;private Expression right;public MulException(Expression left, Expression right) {this.left = left;this.right = right;}@Overridepublic int interpret() {return left.interpret() * right.interpret();}
}//上下文类
class Context {//用于存储表达式private Stack<Expression> expressionStack = new Stack<>();//将给定的表达式入栈public void pushExpression(Expression expression) {expressionStack.push(expression);}//从栈顶弹出并返回一个表达式public Expression popExpression() {return expressionStack.pop();}}

8.10.7总结

  • 优点:可以实现复杂的语法分析功能,同时解析器和语法规则易于单独扩展
  • 总结:就是通过自己定义独立的抽象语法树,使用抽象表达式用于定义解释器的接口、终结符表达式用于定义符号、非终结符表达式包含终结符和非终结符用于存储解释器结果或者向解释器传递信息、上下文来完成解释器的功能
  • 场景:需要解释和执行特定领域或业务规则的语言时

相关文章:

笨蛋学设计模式行为型模式-解释器模式【23】

行为型模式-解释器模式 8.10解释器模式8.10.1概念8.10.2场景8.10.3优势 / 劣势8.10.4解释器模式可分为8.10.5解释器模式8.10.6实战8.10.6.1题目描述8.10.6.2输入描述8.10.6.3输出描述8.10.6.4代码 8.10.7总结 8.10解释器模式 8.10.1概念 ​ 解释器模式用于定义一个语言的文法…...

SAP ABAP SUBMIT常用用法

导语&#xff1a;一直对SUBMIT的用法模模糊糊&#xff0c;每次用都要去查询&#xff0c;本次痛下决心&#xff0c;腾出时间&#xff0c;梳理了一下&#xff0c;如果本文对你有帮助&#xff0c;点个赞再走&#xff5e; 之前分享过SUBMIT调用程序获取内表的值&#xff0c;就不重…...

GitLab备份与恢复测试(基于Docker)

GitLab环境准备 docker run --name gitlab \ -p 2022:22 -p 2080:80 -p 2443:443 -d \ -v /opt/gitlab/config:/etc/gitlab \ -v /opt/gitlab/gitlab/logs:/var/log/gitlab \ -v /opt/gitlab/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:16.2.1-ce.0备份 1.修改配置文件…...

android studio开发的一些问题

1、编译后&#xff0c;输出日志乱码 Help-->Edit Custom VM Options...-->-Dfile.encodingUTF-8 2、编译时&#xff0c;出现&#xff1a;connect timed out 试过很多方法啦&#xff0c;都是不行的。最后我自己摸索出方法。 [1]android studio-->Project-->Grad…...

辞职对于我来说,不可避免(10)

人,从有辞职的想法,再到把辞职出口要多久,一天、一星期还是一个月 “别以为我不知道你搞了什么小动作,以后别瞎搞,不然我不客气”,从老板说出来这句话开始,这家公司我注定不可能再待下去。 我很诧异,小蔡刚离职,公司干活的技术就我一个,况且我也没哪里得罪你,你冒出…...

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…...

CMake+QT+大漠插件的桌面应用开发(QThread)

文章目录 CMakeQT大漠插件的桌面应用开发&#xff08;QThread&#xff09;简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发&#xff08;QThread&#xff09; 简介 在CMakeQT大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例 不过由于主…...

【笔记】Helm-3 主题-9 Helm高级技术

Helm高级技术 这部分解释说明了使用Helm的各种高级特性和技术。这部分旨在为Helm的高级用户提供高度自定义和操作chart及发布的信息。每个高级特性都会有它自己的权衡利弊&#xff0c; 因此每个使用它们的都要有Helm的深度知识并小心使用。或者换言之&#xff0c;谨记 Peter Pa…...

YOLOv5改进 | 主干篇 | 华为GhostnetV1一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv1,华为GhostnetV1一种移动端的专用特征提取网络,旨在在计算资源有限的嵌入式设备上实现高性能的图像分类。GhostNet的关键思想在于通过引入Ghost模块,以较低的计算成本增加了特征图的数量,从而提高了模型的…...

特斯拉FSD的神经网络(Tesla 2022 AI Day)

这是特斯拉的全自动驾驶&#xff08;Full Self Driver&#xff09;技术结构图&#xff0c;图中把自动驾驶模型拆分出分成了几个依赖的模块&#xff1a; 技术底座&#xff1a;自动标注技术处理大量数据&#xff0c;仿真技术创造图片数据&#xff0c;大数据引擎进不断地更新&…...

LLM自回归解码

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;大型语言模型&#xff08;LLM&#xff09;如Transformer进行推理时&#xff0c;自回归解码是一种生成文本的方式。在自回归解码中&#xff0c;模型在生成下一个单词时会依赖于它之前生成的单词。 使用自回归解码的公式…...

#Uniapp:uni.request(OBJECT)

uni.request(OBJECT) 发起网络请求。 示例 uni.request({url: https://www.example.com/request, //仅为示例&#xff0c;并非真实接口地址。data: {text: uni.request},header: {custom-header: hello //自定义请求头信息},success: (res) > {console.log(res.data);thi…...

旅游项目day14

其他模块数据初始化 搜索实现 请求一样&#xff0c;但是参数不一样&#xff0c;根据type划分。 后台需要提供一个搜索接口。 请求分发器&#xff1a; 全部搜索 目的地搜索 精确搜索、无高亮展示 攻略搜索 全文搜索、高亮显示、分页 游记搜搜 用户搜索 丝袜哥...

关于缓存 db redis local 取舍之道

文章目录 前言一、影响因素二、db or redis or local1.db2.redis3. local 三、redisson 和 CaffeineCache 封装3.1 redisson3.1.1 maven3.1.2 封装3.1.3 使用 3.2 CaffeineCache3.1.1 maven3.1.2 封装3.1.3 使用 总结 前言 让我们来聊一下数据缓存&#xff0c;它是如何为我们带…...

imgaug库图像增强指南(33):塑造【云层】效果的视觉魔法

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…...

树莓派ubuntu:CSI接口摄像头安装驱动程序及测试

树莓派中使用OV系列摄像头&#xff0c;网上能搜到的文章资源太老了&#xff0c;文章中提到的摄像头配置选项在raspi-config中并不存在。本文重新测试整理树莓派摄像头的驱动安装、配置、测试流程说明。 libcamera 新版本中使用libcamera作为摄像头驱动程序。 libcamera是一个…...

Webpack5入门到原理6:处理图片资源

处理图片资源 过去在 Webpack4 时&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…...

大语言模型(LLM)有哪些?

国际大语言模型 目前国际上有以下几个知名的大语言模型: GPT-4 GPT-4由OpenAI团队开发&#xff0c;是闭源的。GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是目前最著名的大语言模型之一。最早的版本是GPT-1&#xff0c;之后发展到了GPT-2和GPT-3&…...

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态&#xff08;看到服务使用2个端口号为成功&#…...

NOIP2003提高组T1:神经网络

题目链接 [NOIP2003 提高组] 神经网络 题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&am…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...