笨蛋学设计模式行为型模式-解释器模式【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总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php.2安装Imagick扩展

安装imagemagick apt-get install imagemagick libmagickwand-dev libmagickcore-dev安装imagemagick扩展 /usr/local/php/bin/phpize ./configure --with-php-config/usr/local/php/bin/php-config make make install打开php.ini的imagick扩展 extensionimagick验证是否安装…

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(二):核心机制策略

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:核心机制策略,子节点表示追问或同级提问 日志机制 关于MySQL的几…

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP

前言 整体评价 前三题蛮简单的&#xff0c;T4是一个带状态的DP&#xff0c;这题如果用背包思路去解&#xff0c;不知道如何搞&#xff0c;感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…

tsconfig.json配置详解

使用vite创建vue3项目中会自动生成三个tsconfig相关的文件&#xff0c;分别是&#xff1a;tsconfig.json、tsconfig.node.json、tsconfig.app.json。tsconfig.node.json是专门用来配置vite.config.ts文件的编译规则&#xff0c;tsconfig.app.json则是用来定义项目中其他文件的t…

RTDETR最强结构图 | 包含模型整体结构图 | 全模块展开图 | AiFi模块展开图

文章目录 模型基础结构图AIFI模块结构图模型全模块展开图这一专栏为基于Ultralytics项目的RT-DETR魔改版本,与百度飞桨框架中的RT-DETR相比,除了框架外几乎没有区别。 本专栏旨在为那些渴望通过改进RT-DETR算法发表论文的同学提供全方位支持。每一篇文章都包含完整的改进代码…

chrome浏览器Extension插件开发框架对比和介绍

想开发chrome浏览器插件的话&#xff0c;如果没有一个好的框架支持&#xff0c;那么你只能手写js和html实现了&#xff0c;这样做的话&#xff0c;可能效率没有那么高&#xff0c;所以github上就有一些牛人来定制化了这些操作&#xff0c;将react和vue等开发框架快速集成&#…

kafka的基本使用--学习笔记

catalyst引擎 作用:将SparkSql转换成spark rdd任务提交进行计算 解析器 将sparksql代码解析成语法树(未解析的逻辑查询计划)分析器 将语法树解析成解析后的逻辑查询计划对逻辑查询计划进行属性和关系关联检验优化器 将解析后的逻辑查询计划进行优化, 得到优化后的逻辑查询计划…

【C++进阶07】哈希表and哈希桶

一、哈希概念 顺序结构以及平衡树中 元素关键码与存储位置没有对应关系 因此查找一个元素 必须经过关键码的多次比较 顺序查找时间复杂度为O(N) 平衡树中为树的高度&#xff0c;即O( l o g 2 N log_2 N log2​N) 搜索效率 搜索过程中元素的比较次数 理想的搜索方法&#xff1a…

测试不拘一格——掌握Pytest插件pytest-random-order

在测试领域&#xff0c;测试用例的执行顺序往往是一个重要的考虑因素。Pytest插件 pytest-random-order 提供了一种有趣且灵活的方式&#xff0c;让你的测试用例能够以随机顺序执行。本文将深入介绍 pytest-random-order 插件的基本用法和实际案例&#xff0c;助你摆脱固定的测…

ICCV2023 | MCD: Misalign, Contrast then Distill:重新思考VLP中的错位

论文标题: Misalign, Contrast then Distill: Rethinking Misalignments in Language-Image Pretraining 论文地址&#xff1a;ICCV 2023 Open Access Repository 代码&#xff1a;None LG AI Research 一、问题提出 SLIP发现&#xff0c;在CLIP中引入增强&#xff08;特别…

第30关 k8s容器运行时安全监控 - Falco

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 我们前面讲到prometheus监控、K8S集群事件监控kube-eventer&#xff0c;这些都只是资源使用层面上的监控&#xff0c;对于集群的安全层面监控&#xff0c;我们也需要做好监控手段&#xff0c…

spring项目aop实现接口防止连续点击锁

aop实现 1&#xff0c;注解 注解用于接口方法、接口参数、和请求实体的属性上。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** author dll*/ Ta…

【零碎知识】【Python】@classmethod 与 @staticmethod

classmethod 与 staticmethod这两个方法很容易混淆&#xff0c;因为使用时都是通过类名直接调用其方法&#xff0c;与实例无关。下面记录下两者的区别。 classmethod 在Python中&#xff0c;classmethod是一个装饰器&#xff0c;用于将一个方法标记为类方法。类方法是与类关联…

MfgTool烧写工具

系列文章目录 MfgTool烧写工具 MfgTool烧写工具 系列文章目录一、MfgTool工具简介二、烧写NXP官方系统三、烧写自己的系统四、改造自己的烧写工具 一、MfgTool工具简介 1、mfgtool是NXP官方做的向I.MX系列烧写系统的软件&#xff0c;运行在windows下。可以烧写uboot.imx、zIma…

如何在Shopee深圳站点进行选品并提高销售潜力?

在如今的电商市场中&#xff0c;选品是卖家们提高销售业绩的重要环节。对于在Shopee深圳站点进行选品的卖家来说&#xff0c;了解市场需求、分析竞争对手、优化供应链管理、制定合理的价格策略以及精准的营销策略都是至关重要的。本文将为您介绍一些关键策略&#xff0c;帮助您…

php目录操作示例

目录 1.常用函数 2.列举当前目录列表 3.判断是否是文件夹 1.常用函数 函数名功能scandir 列出指定路径中的文件和目录 opendir 打开文件夹&#xff0c;返回操作资源 readdir读取文件夹资源closedir 关闭文件夹操作资源 is_dir 判断是否是文件夹 filetype 显示是文件夹还是文…

CSS 蜡烛效果

<template><view class="holder"><!-- 身子 --><view class="candle"><!-- 光源 --><view class="blinking-glow"></view><!-- 火星子 --><view class="thread"></view>…

VLM 系列——CLIP——论文解读

一、概述 1、是什么 论文全称《Learning Transferable Visual Models From Natural Language Supervision》,是使用图文对(将图像表征与语言联系起来)使用对比学习(有的文章称为自监督,有的文章称为无监督)训练的多模态模型。从互联网上大量文本的监督(自然语言监督)中…

transformer优化(二)-DETR 学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2005.12872.pdf 代码地址&#xff1a;https://github.com/bubbliiiing/detr-pytorch https://github.com/facebookresearch/detr 1.是什么&#xff1f; DETR&#xff08;Detection Transformer&#xff09;是一种基于Transforme…

新崛起的自动化神器Playwright

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…