Interpreter 解释者模式

c++解释模式interpreter 概念 角色和职责 Context 解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。 AbstractExpression 解释器抽象类。 ConcreteExpression 解释器具体实现类。 案例 #include using namespace std; #include “string” class Context { public: Context(int num) { m_num = num; } public: void setNum(int num) { m_n 阅读详情

模式定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 该模式比较复杂,且不常用。

 

使用方法
文法的定义一般由需求而决定。解释器即根据文法定义来设计。使用方法不具备通用性。

 

使用范围

 需要自定义一个语言,由解释器来翻译文法。

 

 

举例说明
回忆在大学中学到的数学方面的逆波兰式,它遵循数学的运算法则。假设现在有一个逆波兰式 “100 32 25 - +”,翻译过后即为32-25+100,结果为107。现在来定义一个解释器来翻译该文法。

首先定义一个表达式的接口,该表达式代表一个元数据,如100,或者32,也或者一个+号。

import java.util.Stack;

interface Expression {
    public void interpret(Stack<Integer> s);
}

 

接下来用表达式类对每一个元数据进行拆解,分别是数字,运算符号+和-。 此处的定义必须符合逆波兰式也即四则混合运算的法则。

import java.util.Stack;

class TerminalExpression_Number implements Expression { // 数字
    private int number;
    public TerminalExpression_Number(int number){
    	this.number = number; 
    }
    public void interpret(Stack<Integer> s){ 
    	s.push(number); 
    }
}
class TerminalExpression_Plus implements Expression { // 加号
    public void interpret(Stack<Integer> s)  {
    	s.push( s.pop() + s.pop() ); 
    }
}

class TerminalExpression_Minus implements Expression { // 减号
    public void interpret(Stack<Integer> s)  { 
    	s.push( - s.pop() + s.pop() ); 
    }
}

 

然后定义一个解释器,将表达式中的每一个元数据交给不同的表达式类去拆解。最后通过evaluate方法调用全部元数据的栈处理方法获取结果。

class Parser {
    private ArrayList<Expression> parseTree = new ArrayList<Expression>(); // only one NonTerminal Expression here

    public Parser(String s) {
        for (String token : s.split(" ")) {
            if (token.equals("+")) 
            	parseTree.add( new TerminalExpression_Plus() );
            else if (token.equals("-")) 
            	parseTree.add( new TerminalExpression_Minus() );
            else                        
            	parseTree.add( new TerminalExpression_Number(Integer.valueOf(token)) );
        }
    }

    public int evaluate() {
        Stack<Integer> context = new Stack<Integer>(); 
        for (Expression e : parseTree) e.interpret(context);
        return context.pop();
    }
}

 

客户类

public class InterpreterClient {
	public static void main(String[] args) {
        String expression = "100 32 25 - +";
        Parser p = new Parser(expression);
        System.out.println("'" + expression +"' equals " + p.evaluate());
    }
}

下载示例

Matlab信号处理——基于BP神经网络的调制信号分类与识别 如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!对信号进行采样和处理,得到了一系列特征参数,包括幅度均值、频率峰值、频率平方均值以及相位标准差、修正后的相位标准差。 阅读详情

相关推荐

OpenClaw安装方式那么多,但建议大家还是用云厂商吧

OpenCloud的安装方式多样,包括One-liner、npm、pnpm和Hackable等。One-liner提供高效的单行命令安装;npm和pnpm作为Node.js包管理工具,分别提供常规和高性能的安装选项;Hackable则支持定制化安装。不同系统(macOS、Windows)和终端(PowerShell、CMD)的操作步骤各有特点,用户需根据自身技术背景选择合适的安装方式。官方推荐使用闲置计算资源或云部署方案以获得更佳体验。

涛涛讲AI 1401

深入理解Interpreter模式

1)Interpreter模式是一个能给人留下深刻印象的模式。 The Interpreter pattern describes how to define a grammar for simple languages, represent sentences in the language, and interpret these sentences. GoF书中的这句话是点睛之笔。1

albertliangyg的专栏 1129

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 873

关于eval在微信小程序中无法使用的问题

关于eval在微信小程序中无法使用的问题引言一、eval5二、引入第三方工具Binding三、二叉树算法完成简单四则运算中缀表达式转换为后缀表达式(调度场算法) 引言 JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性,因此它也遭到了微信官方的封禁。记得以前有些人想用eval实现热更新代码,而不用经过审核,封掉这类型的代码是正常的。但是,eval函数的优点也是很明显的。例如,使用JS编写一个计算器程序,在遇到"2+1-3*5"这样的字符串时,使用eval就可以很

zhiliao_aaa的博客 5864

企业微信/飞书/钉钉扫码连WiFi保姆级教程(附访客授权技巧)

本文提供了一份企业微信、飞书、钉钉扫码连接WiFi的实战部署教程。通过集成标准Radius协议与OAuth 2.0,企业可实现基于身份的无密码网络认证,并详细介绍了访客授权、权限分级等精细化管理技巧,有效提升无线网络的安全性与员工体验。

t4y5u6i7o的博客 1196

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2106

请求的数据是字符串如何转为json数据?

请求到的数据是字符串转换为JSON数据 解决方法:eval5

wgjiayin的博客 2838

【3DSlicer】基于心脏ct影像重建3d模型及导出

软件:3DSlicer4.11 基于心脏ct影像重建3d模型

Liuees的博客 1万+

设计模式16:Interpreter Pattern(解释者模式)

本文翻译自:http://www.dofactory.com/Patterns/PatternInterpreter.aspxDefine:Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret se

薛敬明的专栏 2369

让闲置 MacBook 当 OpenClaw 主机:合盖运行 + 后台常驻

摘要 本文详细介绍如何将闲置MacBook改造为OpenClaw服务器,实现合盖后持续运行。首先推荐Ubuntu 22.04 LTS作为操作系统,提供详细的安装步骤和分区建议。重点介绍三种禁用合盖休眠的方法:修改systemd-logind配置、使用pm-utils工具以及调整GRUB设置。随后指导如何安装Docker并部署OpenClaw服务,包括创建docker-compose.yml文件和配置环境变量。最后说明如何设置系统服务实现OpenClaw开机自启。通过以上配置,可使MacBook在合盖状态下7

一键难忘的博客 4657

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 81

解释器模式

概述 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。 意图 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 结构图 实现要点 1.Int...

weixin_30924239的博客 195

完美解决Iframe嵌入帆软报表出现跨域cookie写不进去的问题

那报表后续的请求如何加上这个fine_auth_token,通过观察,我们发现,如果给报表url上加上fine_auth_token,后续的请求中的Refer也会有这个fine_auth_token。我们可以这样想,如果帆软内部获取token,如果从cookie中获取不到,就从url上获取,如果url上也获取不到,那么就从请求Refer请求头中获取也可以拿到这个token了。从上面看到,如果从cookie中没有获取到,就从请求头中获取,还是没有就从paramter中获取。

帆软爱好者的专栏 4065

设计模式——Interpreter解释器模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 应用举例4.1 定义Context4.2 Interpreter定义4.3 具体解释器ValueInterpreter、AndInterpreter和OrInterpreter4.3.1 ValueInterpreter4.3.2 AndInterpreter4.3.3 OrInterpreter4.4 Client5 总结参考文献 前言 当一个特定类型的问题发生的概率很高,那么可以将该问题解释为简单的表达式,这样我们定义一个解释器,处理这一

qq_36566262的博客 962

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Interpreter模式(C++解释器模式)

Interpreter模式提供了一个实现语法解释器的框架,其目的就是使用一个解释器为用户提供一个一门定义语言语法表示的解释器,并且通过这个解释器来解释语言中的句子。 Interpreter模式使用类来表示文法规则,因此方便于文法的扩展。 代码如下: #include <iostream> #include <string> using names...

weixin_30767921的博客 127

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

解释器模式(Interpreter)

设计模式系列 Interpreter 解释器模式——对象行为模式 1.意图 给的一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 2.适用性 当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好: 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分...

行走 566

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【第23节】C++设计模式(行为模式)-Interpreter(解释器)模式

Interpreter 模式在以下场景中非常有用:(1)解析配置文件:例如 XML、JSON 等格式的配置文件。(2)查询语言:例如 SQL 查询解析器。(3)规则引擎:例如业务规则的解释和执行。在实际开发中,Interpreter 模式可以与其他设计模式结合使用。例如:(1)使用 **Flyweight 模式** 共享终结符对象,减少内存占用。(2)使用 **Composite 模式** 构建复杂的语法树。

攻城狮7号的博客 1347

设计模式之美:Interpreter(解释器)

索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Interpreter 模式结构样式代码。 实现方式(二):解释波兰表达式(Polish Notation)。 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Given a language, define a re...

aijianxie8808的博客 181

设计模式——行为型模式之——解释器模式Interpreter

解释器模式Interpreter

cyl16688 182

设计模式之Interpreter(解释器)

Interpreter解释器模式定义:定义语言的文法 ,并且建立一个解释器来解释该语言中的句子.Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个语言的文法.我们还是来简单的了解一下:首先要建立一个接口,用来描述共同的操作.public interface AbstractExpression {    void inte

Alinker 869

Interpreter 解释器 行为模式

Interpreter 解释器 行为模式,给定一个语言,定义它的文法的一种表示,并且定义一个解释器,这个解释器使用该表示来解释语言中的例子。  这个模式,在《设计模式》里直接看不懂,我想它应该是一个很有趣的行为模式,是值得深入研究下去的,但是最近比较忙,以后有时间了再来好好研究一下。...

Flash Flex AIR 3D 128

設計模式之Interpreter(解釋器)

  Interpreter定義:定義語言的文法 ,並且建立一個解釋器來解釋該語言中的句子。 Interpreter似乎使用面不是很廣,它描述了一個語言解釋器是如何構成的,在實際應用中,我們可能很少去構造一個語言的文法。我們還是來簡單的瞭解一下: 首先要建立一個介面,用來描述共同的操作。 public interface AbstractExpression {    void interpret

Inber 1374

设计模式----Interpreter(解释器)模式

设计模式----Interpreter(解释器)模式 GOF:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 现在的大大小小(以应用面的宽广来说)编程语言不下几百种。Interpreter模式描述了一个语言解释器是如何构成的,在实际应用中我们可能很少去构造一个语言的文法。因为现有的也学不好啊。考虑再三,我觉定不深入研究了。以后有

菜菜鸟_黑马的专栏 826

Interpreter(解释器)模式

           与Command模式一样,Interpreter模式也会产生一个可执行的对象.差别在于Interpreter模式会创建一个类层次,其中每个类会实现或者解释一个公共操作,这个操作与类的名称相匹配.在这方面,Interpreter模式类似于State模式和Strategy模式.在Interpreter模式、State模式以及Strategy模式中,一个公共操作遍布类集合,每个类...

何新宇的技术博客 604

【2013.3.6】真正的设计模式无需解释,而在心中,在领悟。——Interpreter

// // // // // // // // // ///2013.3.6 // // // // // // // // // 终于走到了设计模式的最后一个。 平心而论, 之前的22个设计模式大多都是比较常见的, 几乎做任何项目都有使用的价值。 然而这个Interpreter模式则不然, 其适用范围较小。

1706
上一篇: 在Agile启动之前启用admin.validate 的debug功能来查错
下一篇: Template Method 模板模式
zigzagsoft
博客等级 码龄19年 34粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值