解释器模式

  • 基本介绍
  • 原理类图
  • 解释器模式的类图实例
  • 解释器模式的代码实例
  • 解释器模式的注意事项和细节

基本介绍

  1. 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。
  2. 解释器模式(Iterpreter Pattern):是指给定一个语言(表达式),定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
  3. 应用场景
  • 应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树
  • 一些重复出现的问题可以用一种简单的语言来表达
  • 一个简单语法需要解释的场景
  1. 这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等。

原理类图


对原理类图的说明-即(解释器模式的角色及职责)

  1. Context:是环境角色,含有解释器之外的全局信息
  2. AbstractExpression:抽象表达式,声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享
  3. TerminalExpression:为终结符表达式,实现与文法中的终结符相关的解释操作。
  4. NonTermialExpression:为非终结符表达式,为文法中的非终结符实现解释操作
  5. 说明:输入Context 和 TerminalExpression 信息通过Client输入即可

解释器模式的类图实例

解释器模式的代码实例

/*** 抽象类表达式,通过HashMap键值对,可以获取到变量的值*/
public abstract class Expression {//a+b-c//解释公式和数值,key 就是公式(表达式)的参数[a,b,c],value就是具体的值//HashMap {a=10,b=20}public abstract int interpreter(HashMap<String, Integer> var);
}
//变量的解释器
public class VarExpression extends Expression {private String key;//key=a,key=b,key=cpublic VarExpression(String key) {this.key = key;}//var 就是{a=10,b=20}// interpreter 根据变量名称,返回对应值@Overridepublic int interpreter(HashMap<String, Integer> var) {return var.get(this.key);}
}
/*** 抽象运算符号解释器  每个运算符号都只和自己左右两个数字有关系,* 但左右两个数字有可能也是一个解析的结果,无论何种类型,都是Expression的实现类*/
public class SymbolExpression extends Expression {protected Expression left;protected Expression right;public SymbolExpression(Expression left, Expression right) {this.left = left;this.right = right;}//因为SymbolExpression是让其子类来实现,因此interpreter是一个默认实现@Overridepublic int interpreter(HashMap<String, Integer> var) {return 0;}
}
/*** 加法解释器*/
public class AddExpression extends SymbolExpression {public AddExpression(Expression left, Expression right) {super(left, right);}//处理相加// var 仍然是{a=10,b=20}..public int interpreter(HashMap<String, Integer> var) {//super.left.interpreter(var):返回left表达式对应的值 a=10//super.right.interpreter(var):返回right表达式对应的值 b=20return super.left.interpreter(var) + super.right.interpreter(var);}
}
public class SubExpression extends SymbolExpression {public SubExpression(Expression left, Expression right) {super(left, right);}//求出left和right表达式相减后的结果public int interpreter(HashMap<String, Integer> var) {return super.left.interpreter(var) - super.right.interpreter(var);}
}
public class Calculator {//定义表达式private Expression expression;//构造函数传参,并解析public Calculator(String expStr) {//安排运算先后顺序Stack<Expression> stack = new Stack<>();//表达式拆分成字符数组char[] charArray = expStr.toCharArray();//[a,+,b]Expression left = null;Expression right = null;//遍历字符数组,即遍历[a,+,b]//针对不同的情况,做相应处理for (int i = 0; i < charArray.length; i++) {switch (charArray[i]) {case '+':left = stack.pop(); //从stack中取出left => "a"right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new AddExpression(left, right));break;case '-':left = stack.pop();right = new VarExpression(String.valueOf(charArray[++i]));stack.push(new SubExpression(left, right));break;default://如果是一个Var 就创建要给VarExpression对象,并push到stackstack.push(new VarExpression(String.valueOf(charArray[i])));break;}}//当遍历完整个charArray数组后,stack就得到最后Expressionthis.expression = stack.pop();}public int run(HashMap<String, Integer> var) {//最后将表达式a+b和var 绑定{a=10,b=20}//然后传递给expression的interpreter进行解释执行return this.expression.interpreter(var);}
}

客户端

public class Client {public static void main(String[] args) throws IOException {String expStr = getExpStr();HashMap<String, Integer> var = getValue(expStr);Calculator calculator = new Calculator(expStr);System.out.println("运算结果:" + expStr + "=" + calculator.run(var));}//获得表达式private static String getExpStr() throws IOException {System.out.print("请输入表达式:");return (new BufferedReader(new InputStreamReader(System.in))).readLine();}//获得值映射private static HashMap<String, Integer> getValue(String expStr) throws IOException {HashMap<String, Integer> map = new HashMap<>();for (char ch : expStr.toCharArray()) {if (ch != '+' && ch != '-') {if (!map.containsKey(String.valueOf(ch))) {System.out.println("请输入" + String.valueOf(ch) + "的值:");String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();map.put(String.valueOf(ch), Integer.valueOf(in));}}}return map;}
}

解释器模式的注意事项和细节

  1. 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性
  2. 应用场景:编译器、运算表达式计算、正则表达式、机器人等
  3. 使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用方法,将会导致调试非常复杂、效率可能降低。

设计模式学习——解释器模式相关推荐

  1. 螃蟹学PHP设计模式之解释器模式

    2019独角兽企业重金招聘Python工程师标准>>> 8.解释器模式 今天又迟到了一个小时,不过现在基本任务都做完了,螃蟹的效率还是挺高的.昨天一天跑各个工商局,发现大学生创业的扶 ...

  2. python实现解释器_Python设计模式之解释器模式

    解释器模式 对每个应用来说,至少有以下两种不同的用户分类. 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了. 高级用户:这些用户, ...

  3. java 设计模式之解释器模式(十九)

    java 设计模式之解释器模式①⑨ 定义 角色分析 使用场景 代码实现 躁动的心灵,不安的灵魂.在彷徨中挣扎,在迷失中探索.时光飞逝,努力不变. 设计模式学习,近期我会把23种设计模式都写成博客,敬请 ...

  4. php 解释器模式,螃蟹学PHP设计模式之解释器模式

    8.解释器模式 今天又迟到了一个小时,不过现在基本任务都做完了,螃蟹的效率还是挺高的.昨天一天跑各个工商局,发现大学生创业的扶持真是太少了,还是写代码比较顺心.越学到后面,就越需要理解和区别不同的设计 ...

  5. 北风设计模式课程---解释器模式(Interpreter Pattern)

    北风设计模式课程---解释器模式(Interpreter Pattern) 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 设计模式都是对生活的抽象,比如用 ...

  6. 设计模式之---解释器模式

    解释器模式概述 解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器.在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的 ...

  7. 设计模式之解释器模式

    解释器模式字面意思,也即解释某些内容的含义.这种设计模式是实际开发中最不容易用到的.比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式. 本文就以解释器模式的概念. ...

  8. 「补课」进行时:设计模式(20)——解释器模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 解释器模式 解释器模式这个模式和前面的访问者模式比较像,当然,我说的比较像是难的比较像,以及使用率是真的比较低,基本上没有使用的场景,访问者模式还有 ...

  9. 设计模式之解释器模式(Interpreter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. 64位系统matlab上安装libsvm
  2. web前端怎么获取cookie?新手前端开发者需了解
  3. 大家都在聊的人工智能,究竟是什么?
  4. 【Git】git使用:新建仓库、管理分支、冲突解决
  5. poj 3071 Football
  6. 椭圆极点极线性质_笔记:关于极点极线的一些思考
  7. Go 语言里怎么正确实现枚举?答案藏着官方的源码里
  8. 开发者如何学好 MongoDB
  9. 神经网络之激活函数(activation function)
  10. GitHub开源项目学习 电商系统Mall (一) Mall简介
  11. 允许计算机远程桌面连接数,win7连接远程桌面提示超出了最大允许连接数的解决方法...
  12. 【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展
  13. 淘宝开放平台技术历程----学习转载
  14. 第4章第16节:图表:使用三维饼图制作年度销售额图表 [PowerPoint精美幻灯片实战教程]
  15. 预训练模型微调 | 一文带你了解Adapter Tuning
  16. 出海欧洲《通用数据保护条例》解读,附GDPR白皮书下载
  17. 注解与APT、JavaPoet
  18. 红图app的模式有未来吗?
  19. MCP认证考试是什么样的考试?
  20. DirectX修复工具增强版更新包

热门文章

  1. java aes加密 linux和windows,AES加密在windows與linux平台下顯示結果不同,解決方案
  2. 致我的QQ农场和牧场
  3. ChatGPT 教程 - 从入门到精通-part2-完整版
  4. roc曲线spss怎么做_SPSS在线_SPSSAU_SPSS_ROC曲线
  5. MKL与VS2019配置方法
  6. linux 动态库和静态库分析实例
  7. 【新笔记本环境配置】win10下 Anaconda+Vscode+MobaXterm安装
  8. 我们应该相信那些狂热的天才工程师么?
  9. 计算机网络摩尔定律芯片运算速度,需要定时刷新的半导体存储器芯片是什么 答案:DRAM...
  10. 视频播放小程序-小程序媒体API-基础入门