.NET 设计模式—解释器模式(Interpreter Pattern)

简介

解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。使用了解释器模式,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类容易直接编写。

角色

  • 抽象表达式(AbstractExpression):定义解释器的接口,约定解释器的解释操作。其中的Interpret接口,正如其名字那样,它是专门用来解释该解释器所要实现的功能。
  • 终结符表达式(Terminal Expression):实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
  • 非终结符表达式(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+”就是非终结符,解析“+”的解释器就是一个非终结符表达式。
  • 环境角色(Context):这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。
  • 客户端(Client):指的是使用解释器的客户端,通常在这里将按照语言的语法做的表达式转换成使用解释器对象描述的抽象语法树,然后调用解释操作。

优点

  • 可扩展性比较好,灵活。
  • 增加了新的解释表达式的方式
  • 易于实现简单文法。

缺点

  • 当文法规则比较复杂时,会引起类膨胀,比较难维护。
  • 当文法规则比较复杂时,如果出错了,调试比较困难。
  • 执行效率比较低下。因为当表达式比较复杂,结果层层依赖的话会采用递归方式进行解析。

应用场景

  • 当我们有一些需要重复解析的问题可以考虑定义一个表达式来进行表达。
  • 一些简单的语法如果需要解释的话也可以考虑解释器模式。
  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
  • 编译器
  • 运算表达式计算、正则表达式
  • 机器人

实现

  • 定义解释器接口
public interface IInterpreter
{int Interpret(string expression);
}
  • 创建具体解释器类
public class NumberInterpreter : IInterpreter
{private readonly string _value;public NumberInterpreter(string value){_value = value;}public int Interpret(string expression){// 这里只是简单地返回数字值,实际中可能需要更复杂的解析逻辑。return int.Parse(_value);}
}public class AdditionInterpreter : IInterpreter
{private readonly IInterpreter _leftOperand;private readonly IInterpreter _rightOperand;public AdditionInterpreter(IInterpreter leftOperand, IInterpreter rightOperand){_leftOperand = leftOperand;_rightOperand = rightOperand;}public int Interpret(string expression){return _leftOperand.Interpret(expression) + _rightOperand.Interpret(expression);}
}
  • 构建上下文类
public class ExpressionContext
{private readonly IInterpreter _rootInterpreter;private readonly Dictionary<char, IInterpreter> _operatorInterpreters = new Dictionary<char, IInterpreter>();private readonly Dictionary<string, IInterpreter> _terminalInterpreters = new Dictionary<string, IInterpreter>(); // 用于存储数字等终端符号的解释器。public ExpressionContext(){// 初始化操作符解释器(这里仅初始化加法)_operatorInterpreters['+'] = new AdditionInterpreter(null, null); // 初始化为 null,稍后填充具体参数。// ... 可以添加其他操作符的解释器初始化代码。}public void AddTerminalInterpreter(string value, IInterpreter interpreter) => _terminalInterpreters[value] = interpreter; // 添加终端符号的解释器。public void AddOperatorInterpreter(char operatorChar, IInterpreter leftOperand, IInterpreter rightOperand) => _operatorInterpreters[operatorChar] = new AdditionInterpreter(leftOperand, rightOperand); // 添加操作符的解释器。并确保它们正确初始化。public int EvaluateExpression(string expression) => _rootInterpreter.Interpret(expression); // 使用根解释器来解析整个表达式。具体实现取决于表达式的结构。这里只是一个示例方法。实际应用中可能需要更复杂的解析逻辑。
}

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

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

相关文章

Rust面试宝典第4题:打家劫舍

题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统。如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的非负整…

跟TED演讲学英文:The dark side of competition in AI by Liv Boeree

The dark side of competition in AI Link: https://www.ted.com/talks/liv_boeree_the_dark_side_of_competition_in_ai Speaker:Liv Boeree Date: October 2023 文章目录 The dark side of competition in AIIntroductionVocabularyTranscriptSummary后记 Introduction Co…

Qt 实战(2)搭建开发环境 | 2.1、Windows下安装QT

一、Windows下安装QT 1、QT官网 QT官网&#xff1a;https://download.qt.io/&#xff0c;打开官网地址&#xff0c;如下&#xff1a; 目录结构介绍 目录说明snapshots预览版&#xff0c;最新的开发测试中的 Qt 库和开发工具onlineQt 在线安装源official_releases正式发布版&am…

HarmonyOS开发案例:【智能煤气检测】

样例简介 智能煤气检测系统通过实时监测环境中烟雾浓度&#xff0c;当一氧化碳浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能煤气检测系统的报警阈值&#xff0c;远程接收智能煤气检测系统报警信息。…

【考研数学】全年各阶段用书汇总+资料分享

我一战备考很迷茫&#xff0c;身边室友也都是&#xff0c;和室友一起去买资料&#xff0c;网上推荐的看到了就都买了 大家都不知道怎么样才能选对数学参考书然后快速进入备考状态&#xff0c;最后犹犹豫豫买了一堆资料都没有正式开始备考... 从小都算是身边人口中“偏科&…

HTML中div/span标签、音频标签、视频标签与特殊字符

目录 div/span标签 音频标签 视频标签 特殊字符 div/span标签 在HTML中&#xff0c;<div></div>和<span></span>是没有语义的&#xff0c;可以将两个标签当做两个盒子&#xff0c;里面可以容纳内容 两个标签有以下两个特点&#xff1a; 1. <…

Mybatis常用注解说明

MyBatisPlus 常用注解说明 TableName(opens new window) 描述&#xff1a;表名注解&#xff0c;标识实体类对应的表 使用位置&#xff1a;实体类 TableName("sys_user") public class User {private Long id;private String name;private Integer age;private Strin…

《系统架构设计师教程(第2版)》第9章-软件可靠性基础知识-05-软件可靠性测试

文章目录 1. 概述2. 定义软件运行剖面2.1 软件的使用行为建模2.2 输入域分层2.3 弧上的概率分配2.4 其他注意点 3. 可靠性测试用例设计4. 可靠性测试的实施4.1 测试前检查4.2 注意点4.2 可靠性测试的难点1&#xff09;失效判断的主观性2&#xff09;计算的错误结果不易被发现 4…

5_vscode+valgrind+gdb调试程序

需求 项目程序, 读取串口数据, 出现程序崩溃问题valgrind 可以调试定位内存问题: 内存泄漏,非法地址访问,越界访问等内存问题vscode gdb 可视化调试效果, 比命令行简单快捷很多期望使用vscode valgrind gdb 调试程序内存异常, 崩溃退出的问题 环境准备 sudo apt install v…

论文笔记:(INTHE)WILDCHAT:570K CHATGPT INTERACTION LOGS IN THE WILD

iclr 2024 spotlight reviewer 评分 5668 1 intro 由大型语言模型驱动的对话代理&#xff08;ChatGPT&#xff0c;Claude 2&#xff0c;Bard&#xff0c;Bing Chat&#xff09; 他们的开发流程通常包括三个主要阶段 预训练语言模型在被称为“指令调优”数据集上进行微调&…

Pytorch-张量形状操作

&#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; &#x1f339; reshape 函数 transpose 和 permute 函数 view 和 contigous 函数 squeeze 和 unsqueeze 函数 在搭建网络模型时&#xff0c;掌握对张量形状的操作是非常重要的&#xff…

JVM虚拟机(九)如何开启 GC 日志

目录 一、引言二、开启 GC 日志三、解析 GC 日志四、优化建议 一、引言 在 Java 应用程序的运行过程中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是一个非常重要的环节。GC 负责自动管理内存&#xff0c;回收不再使用的对象所占用的…

25 vs code配置

1.中文语言 搜索chinese&#xff0c;安装&#xff0c;等待重新打开 2.remote ssh 安装后F1打开&#xff0c;输入adduser 输入ssh [用户名][主机ip]&#xff0c;添加主机&#xff0c;然后选择保存配置文件 如果出现管道不存在&#xff0c;设置一下 如果出问题&#xff0c;也…

VBA脚本: excel隐藏和展开指定行 【图文】

打开开发工具功能 【文件】-》【选项】-》【自定义功能区】-》勾选【开发工具】-》【确定】 代开VBA编辑器 【开发工具】-》【Visual Basic】 插入模块 编写代码 所有sheet 关闭 Sub HideRowsInAllSheets()Dim ws As WorksheetDim i As Integer 循环遍历所有工作表For E…

YOLOv8改进 | 知识蒸馏 | 利用模型蒸馏改进YOLOv8进行无损涨点(在线蒸馏 + 离线蒸馏)

一、本文介绍 这篇文章给大家带来的是模型的蒸馏&#xff0c;利用教师模型指导学生模型从而进行模型的涨点&#xff0c;本文的内容不仅可以用于论文中&#xff0c;在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术&#xff0c;所以大家可以仔细学习一下本文的内容&#…

Spring Boot 处理过滤器(filter )中抛出的异常

前言&#xff1a; 在改造老项目登录功能的时候&#xff0c;使用了过滤器对 token 进行有效性验证&#xff0c;验证通过继续进行业务请求&#xff0c;验证不通过则抛出校验异常。 过程&#xff1a; 技术方案拟定后&#xff0c;就着手开始改造&#xff0c;一切都很顺畅&#x…

大数据平台搭建2024(二)

二&#xff1a;Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

【YOLO系列PR、F1绘图】更改v5、v7、v8(附v8训练、验证方式),实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

目录 1. 前提 效果图2. 更改步骤2.1 得到PR_curve.csv和F1_curve.csv2.1.1 YOLOv7的更改2.1.1.1 得到PR_curve.csv2.2.1.2 得到F1_curve.csv 2.1.2 YOLOv5的更改&#xff08;v6.1版本&#xff09;2.1.3 YOLOv8的更改&#xff08;附训练、验证方式&#xff09; 2.2 绘制PR曲线 …

牛客-环形链表的约瑟夫问题

目录 题目 描述 示例1 示例2 图解 代码(解析在注释中) 题目 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号…

zabbix 自动发现与自动注册 部署 zabbix 代理服务器

zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。1.确保客户端…