Interpreter 解释器模式

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

模式定义

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

使用方法

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

使用范围

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

举例说明

回忆在大学中学到的数学方面的逆波兰式,它遵循数学的运算法则。假设现在有一个逆波兰式 “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());
    }
}

下载示例

FPGA开发者必看:Xilinx PCIe IP核BAR地址配置避坑指南(附实例解析) 本文为FPGA开发者提供了Xilinx PCIe IP核中BAR地址配置的详细避坑指南。文章深入解析了32位与64位地址空间的选择逻辑、Pcie to AXI Translation参数的核心作用,并通过实例说明如何正确配置以避免地址映射错乱和数据访问失败。重点探讨了BAR空间类型、大小设定以及地址转换机制,帮助开发者构建清晰可靠的PCIe系统,是调试与优化PCIe设计的关键参考。 阅读详情

相关推荐

ROS学习笔记之——无人机PID调参过程记录

For cooperaive inquiries, please visit the website:guanweipeng.com

gwpscut的博客 6830

深入理解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

Android15 AndroidV冻结和解冻的场景

cgroup 最初由 Google 工程师 Paul Menage 和 Rohit Seth 在 2006 年提出,是一种细粒度资源控制的Linux内核机制。于 2007 年合并到 Linux 内核主线中。然而 Google 原生系统直到 Android 11 或更高版本上才支持 CACHE 应用的 CPU 冻结功能。当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。

苏法迪的专栏 1788

Interpreter 解释者模式

模式定义给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 该模式比较复杂,且不常用。  使用方法文法的定义一般由需求而决定。解释器即根据文法定义来设计。使用方法不具备通用性。 使用范围  需要自定义一个语言,由解释器来翻译文法。  举例说明回忆在大学中学到的数学方面的逆波兰式,它遵循数学的运算法则。假设现在有一个逆波兰

ZigzagSoft.net 554

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

SWIFT报文实战指南:从MT700到MT799的信用证操作全解析

本文深入解析了国际贸易中信用证操作的核心SWIFT报文流程,从开证的MT700到各类通知、修改及结算报文(如MT707、MT730、MT754、MT732/734等)。通过实战案例与关键字段拆解,指导外贸与银行从业者精准处理报文,规避风险,并探讨了利用自动化工具提升处理效率的方法,助力保障跨境交易顺畅。

weixin_29015801的博客 885

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

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

zhiliao_aaa的博客 5864

java链接opc报异常org.jinterop.dcom.common.JIException: Access is denied解决

记录一下这次从发现问题到解决问题的过程 项目是通过java链接OPC,读取数据,并且发送数据的 程序一直运行正常,最近客户反馈说无法读取数据,通过查看,发现访问异常了。花了2天的时间才解决了这个异常。 org.jinterop.dcom.common.JIException: Access is denied, please check whether the [domain-username-password] are correct. Also, if not already done please c

机器学习菜鸟 1万+

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

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

wgjiayin的博客 2838

ctfshow 萌新22 (类似级客巅峰web4)

在之前ctfshow平台的萌新22,大家都认为是无解的,题目也介绍了"还能搞,阿呆表示将直播倒立放水"。但是在级客巅峰结束的那天晚上,群里的师傅介绍说,如果修改了php.ini里面的配置(register_argc_argv)可以做出来。最后是真的做出来了。 使用阿呆~~~? 下面是自己的思考,感谢Guoke师傅和ha1c9on师傅的帮助 一. 源代码 <?php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_mat.

Firebasky的博客 4217

从 SAP BTP trial 到第一个 CPI iFlow 的实操路线图

本文介绍了如何从零开始学习SAP CPI(现称SAP Integration Suite中的Cloud Integration能力)。主要内容包括:1)明确学习边界,建议使用SAP BTP trial账号进行个人练习,注意90天有效期限制;2)理解SAP BTP账号模型层级结构(Global Account→Subaccount→Space);3)详细说明申请trial账号流程,推荐选择Singapore区域以避免兼容问题;4)指导如何检查Entitlements和Quotas,强调应专注于SAP Inte

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 167

设计模式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

MATLAB基础应用精讲-【图像处理】GNN图神经网络(附python代码实现)

图神经网络由于其在处理非欧空间数据和复杂特征方面的优势,受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。图结构可描述复杂关系,如基因结构、通信网络、交通路线、社交网络等。图计算挖掘结构信息,但无法学习节点特征。神经网络在欧氏空间数据上表现优越,但无法直接应用于非欧氏空间的图数据。图神经网络结合图计算和神经网络优势,处理非欧氏空间数据及其复杂特征,应用于网络链接预测、推荐系统和交通道路分析等场景。实际应用中,图数据规模庞大,如百亿级节点、千亿级边,存储开销超过10TB。

qq_36130719的博客 1141

解释器模式-Interpreter Pattern

解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向 对象语言构成一个简单的语言解释器。在某些情况下,为了更好地描述某一些特定类型的问 题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问 题的实例将对应为该语言中的句子。此时,可以使用解释器模式来设计这种新的语言。对解 释器模式的学习能够加深我们对面向对象思想的理解,并且掌握编程语言中文法规...

心猿意碼 5189

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

解释器模式(Interpreter Pattern)

解释器模式(interpreter pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 动机 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。(例如:正则表示式) 结构 参与者 AbstractExpres

jiangxt211的专栏 475

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

小威的博客 2万+

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

解释器模式(Interpreter Pattern)是一种软件设计模式,属于行为型模式之一。这种模式的主要目的是定义语言的语法表示,并且提供了一个解释器来处理这种表示。解释器模式可以用于解析语言或表达式等场合,特别是在编译器、解释器和自然语言处理中应用较多。解释器模式包含以下几个主要角色: Abstract Expression 创建接口方法 Terminal Expression 对数据简单处理 Terminal Expression 是解释器模式中的一种表达式类型,它表示文法中的最基本元素,这些元素不

ling_zhi_xin的博客 1978

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

What: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 Why: 优点: 1.可扩展性比较好,灵活; 2.增加新的解释表达式不需改动原有的代码,符合开闭原则; 3.易于实现简单文法。 缺点: 1.当语法规则数目太多时,增加了系统的复杂度; 2.解释器模式采用递归调用方法,执行效率低,调试困难; 3.对于复杂的文法比较难维护; 4.解释器模式...

qq_37212210的博客 364

设计模式-解释器模式-Interpreter Pattern

解释器模式(Interpreter Pattern)是一种行为设计模式,它主要用于定义如何评估语言的语法或表达式,是一种用于解释执行语言的模式。这种模式涉及到创建一个表达式接口,该接口能够解释一个特定的上下文。解释器模式通常用于解析和执行语言的语法规则,如计算表达式、解析文本文件等。抽象表达式(AbstractExpression):终结符表达式(TerminalExpression):非终结符表达式(NonterminalExpression):上下文(Context):客户端(Client):需要解释一

wesigj的博客 1704

解释器模式(Interpreter Pattern)

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

dxm809的博客 248

解释器模式 (Interpreter Pattern)

行为型设计模式

qq_35861084的博客 1055

解释器模式 Interpreter Pattern

一、模式介绍 1.1、定义 解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。也就是说,用变易语言的方式来分析应用中的实例。这种模式实现了语法表达式处理的接口,该接口解释一个特定的上下文。 1.2、优点 扩展性好。由于解释器模式中使用类来表示语言的语法规则,因此可以通过继承等机制来改变或扩展 容易实现。在语法树中的每个表达式节点类都是相似的,所以实现其语法较为容易 1.3、缺点 执行效率较低。解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速

木易 389
上一篇: Proxy 代理模式
下一篇: IBM JDK6 SR2的Java Reflection在AIX平台的缺陷发现
zigzagsoft
博客等级 码龄19年 34粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值