所谓解释器模式就是定义一个语言的文法,并建立一个解释器来解释该语言中的句子!
比如:taglib标签,正则表达式都是采用的解释器。
解释器不仅仅只定义一种语法语义,更可以使用一个抽象语法树定义一个语言实例。
解释器角色:
AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
Context: 环境类。包含解释器之外的一些全局信息。
Client: 客户类。 抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。
下面用解释器处理上面的例子: 5*6/3%4
//抽象表达式 public interface Node{ public int interpret(); } //非终结表达式实现 public class ValueNode implements Node{ private int value; public ValueNode(int value){ this.value=value; } public int interpret(){ return this.value; } }
//抽象终结表达式 public abstract class SymbolNode implements Node{ public Node left; public Node right; public SymbolNode(Node left,Node right){ this.left=left; this.right=right; } }
//乘法 public class MulNode extends SymbolNode{ public MulNode(Node left,Node right){ super(left,right); } public int interpret(){ return left*right; } } //除法 public class DevNode extends SymbolNode{ public DevNode(Node left,Node right){ super(left,right); } public int interpret(){ return left/right; } } //取模 public class MolNode extends SymbolNode{ public MolNode(Node left,Node right){ super(left,right); } public int interpret(){ return left%right; } }
public class Calculator{ public int result; public Calculator(String expStr) { // 定义一个堆栈,安排运算的先后顺序 Stack<Node> stack = new Stack<Node>(); // 表达式拆分为字符数组 char[] charArray = expStr.toCharArray(); // 运算 Node left = null; Node right = null; for (int i = 0; i < charArray.length; i++) { switch (charArray[i]) { case '*': // // 结果放到堆栈中 left = stack.pop(); right =new ValueNode( Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new MulNode(left, right)); break; case '/': left = stack.pop(); right = new ValueNode( Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new DevNode(left, right)); break; case '%': left = stack.pop(); right = new ValueNode(Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new MolNode(left, right)); break; default: // 公式中的变量 stack.push(new ValueNode(Integer.parseInt(String.valueOf(charArray[++i])))); } this.result=stack.pop(); } public int getResult(){ return this.result; } }
//客户端 main(){ String express="5*6/3%4"; Calculator c=new Calculator (express); System.out.print(c.getResult()); }
解释器模式扩展性强,能处理表达式中重复出现的问题,但是应用场景少。
相关推荐
Interpreter(解释器)模式.doc
Interpreter解释器模式在C#中的实现
解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...
解释器模式(Interpreter) 用意:定义一种语言,定义它的方法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
JS-Interpreter, 在JavaScript中,沙箱JavaScript解释器 js解释器JavaScript中的沙箱JavaScript解释器。 独立执行任意的JavaScript代码行并安全。现场演示:https://neil.fraser.name/software/JS-Interpreter/文档...
C#面向对象设计模式 (行为型模式) Interpreter 解释器模式 视频讲座下载
项目标签:[人工智能] [LLM] [代码解释器] [自然语言处理] 推荐理由:一个允许在您的终端本地运行OpenAI的代码解释器的项目。它为开发者提供了一种便捷的方式来解释和执行OpenAI生成的代码,使其在本地环境中更易于...
给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
给一个自定义语法的语言写一个解释器(Interpreter),首先写了Parser,然后存入剖析树(Parse Tree)对象中,最后根据Parse Tree的结构执行程序,计算出结果。 语法如下: <prog> ::= program <decl seq> ...
BASIC的一个解释器 解释BASIC
[inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行1
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不... 这是第16节:行为型模式Interpreter解释器模式
本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下: 解释器模式,它是什么呢? 意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来...
simPL-解释器JAVA 中的静态类型 simPL 解释器SimPL 语言规范:doc/spec-4.2.pdf IDE:Eclipse要测试解释器,请修改 src/simpl/interpreter/Interpreter.java
php设计模式 Interpreter(解释器模式),需要的朋友可以参考下。
Ch,一个C语言解释器,没错,这是一个C语言解释器,不是编译器.对于学习C语言的人很有帮助,还能将它嵌入自己的程序解释执行C语言脚本.
解释器模式需要解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就...解释器模式 (interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
皮卡丘口译员这是用python编写的皮卡丘的解释器。 可以在找到名为“ pikachu”的深奥编程语言的定义安装$ git clone https://github.com/joelsmithjohnson/pikachu-interpreter$ cd pikachu-interpreter$ python ...
C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式 (Level 300)