解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析

Context.m (环境类,包含解释器之外的一些全局信息)

  1. classdef Context < handle
  2. properties
  3. variables = containers.Map();
  4. end
  5. methods
  6. function put(obj,var,expr)
  7. obj.variables(char(var)) = expr;
  8. end
  9. function expr = lookup(obj,var)
  10. if(obj.variables.isKey(char(var)))
  11. expr = obj.variables(char(var));
  12. else
  13. expr = Expression.empty();
  14. end
  15. end
  16. end
  17. end

Expression.m (抽象表达式)

  1. classdef Expression < handle & matlab.mixin.Heterogeneous
  2. methods(Abstract)
  3. interpret(obj,ctx);
  4. end
  5. end

Plus.m (非终结表达式,加法类)

  1. classdef Plus < Expression
  2. properties
  3. left;
  4. right;
  5. end
  6. methods
  7. function obj = Plus(left,right)
  8. obj.left = left;
  9. obj.right = right;
  10. end
  11. function res = interpret(obj,ctx)
  12. res = obj.left.interpret(ctx) + obj.right.interpret(ctx);
  13. end
  14. end
  15. end

Minus.m (非终结表达式,减法类)

  1. classdef Minus < Expression
  2. properties
  3. left;
  4. right;
  5. end
  6. methods
  7. function obj = Minus(left,right)
  8. obj.left = left;
  9. obj.right = right;
  10. end
  11. function res = interpret(obj,ctx)
  12. res = obj.left.interpret(ctx) - obj.right.interpret(ctx);
  13. end
  14. end
  15. end

Variable.m (非终结表达式,变量类)

  1. classdef Variable < Expression
  2. properties
  3. name
  4. end
  5. methods
  6. function obj = Variable(name)
  7. obj.name = name;
  8. end
  9. function res = interpret(obj,ctx)
  10. if(isempty(ctx.lookup(obj.name)))
  11. res = 0;
  12. else
  13. res = ctx.lookup(obj.name).interpret(ctx);
  14. end
  15. end
  16. end
  17. end

Number.m (终结表达式,数字类)

  1. classdef Number < Expression
  2. properties
  3. number
  4. end
  5. methods
  6. function obj = Number(number)
  7. obj.number = number;
  8. end
  9. function number = interpret(obj,~)
  10. number = obj.number;
  11. end
  12. end
  13. end

Evaluator.m (非终结表达式,解析入口类)

  1. classdef Evaluator < Expression
  2. properties
  3. syntaxTree
  4. end
  5. methods
  6. function obj = Evaluator(expr)
  7. exprs = Expression.empty();
  8. tokens = expr.split(" ");
  9. for i=1:length(tokens)
  10. switch(tokens(i))
  11. case "+"
  12. subexpr = Plus(exprs(end-1),exprs(end));
  13. exprs = exprs(1:end-2);
  14. exprs(end + 1) = subexpr;
  15. case "-"
  16. subexpr = Minus(exprs(end-1),exprs(end));
  17. exprs = exprs(1:end-2);
  18. exprs(end + 1) = subexpr;
  19. otherwise
  20. exprs(end + 1) = Variable(tokens(i));
  21. end
  22. end
  23. obj.syntaxTree = exprs(end);
  24. end
  25. function res = interpret(obj,ctx)
  26. res = obj.syntaxTree.interpret(ctx);
  27. end
  28. end
  29. end

test.m (测试代码)

  1. expr = "w x z + -";
  2. ctx = Context();
  3. ctx.put("w",Number(5));
  4. ctx.put("x",Number(6));
  5. ctx.put("z",Number(4));
  6. eva = Evaluator(expr);
  7. res = eva.interpret(ctx);
  8. disp(res);

参考资料:

https://www.jianshu.com/p/0e7e26bbe204

https://www.cnblogs.com/chenpi/p/5222496.html

Matlab解释器模式的更多相关文章

  1. interpreter(解释器模式)

    一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...

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

    <?php /* * 解释器模式:给定一种语言,定义它文法的一种表示,并定义一个解释器,该解释器利用该表示来解释语言中的句子 * */ class Expression { function i ...

  3. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  4. 解释器模式(Interpreter Pattern)

    定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...

  5. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  6. JAVA 设计模式 解释器模式

    用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构

  7. 深入浅出设计模式——解释器模式(Interpreter Pattern)

    模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...

  8. JAVA设计模式之解释器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...

  9. 【GOF23设计模式】解释器模式 & 访问者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter  2.访问者模式Visitor 

随机推荐

  1. LCD裸板编程_框架

    lcd程序框架: 为了让程序更好的扩展,介绍面向对象编程: 比如抽象出lcd_3.5和lcd_4.3的共同点: 当我想使用3.5寸的lcd时,只需让lo指向lcd_3.5_opr即可.同样,当我想使用 ...

  2. 修改opencart extension插件代码后无法重新安装的解决办法

    有时我们在为opencart安装一些插件后,发现有些地方需要细微的调整,然后去修改插件代码重新安装,但是却没有成功.开始有点怀疑是不是不能修改代码,但也不至于啊,不然开发者怎么制作插件.应该是哪里出了 ...

  3. Java 内存分配(转)

    Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性. 寄存器:JVM内部虚拟寄 ...

  4. html-前端内容初识

    HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的规则(W3C),大家都来遵守他,这 ...

  5. Windows server 2003 粘滞键后门+提权

    Windows server 2003中可以建立粘滞键与cmd的连接来绕过已经设置好的安全机制做一些事情,比如新建用户.提权 粘滞键介绍 网上查了一些资料,也没怎么说明白,不如自己试一下,大概意思就是 ...

  6. HBase快照迁移数据失败原因及解决办法

    目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...

  7. docker 部署 jenkins

    建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository). 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 ...

  8. 通过rpm安装crontab

    可以在对应的虚拟机centos上查看 所安装的crontab安装信息,然后选中rpm包进行安装,命令:rpm -qa |grep cron 如: 如没有上述信息,表名没有安装,也可以直接用cronta ...

  9. mac下编程使用字体

    1.xcode下使用的是Menlo的18号字体 2.webStorm使用的也是Menlo的18号字体 3.sublime Text 使用的也是Menlo的21号字体

  10. 【Gamma】Scrum Meeting 8

    前言 会议定点:大运村公寓 会议时间:2019/6/7 会议目的:分配任务,准备宣传 一.任务进度 组员 上周任务进度 下阶段任务 大娃 辅助做好引导录屏 优化辅助模型 二娃 撰写会议博客 撰写会议博 ...