Matlab解释器模式
解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析。
Context.m (环境类,包含解释器之外的一些全局信息)
- classdef Context < handle
- properties
- variables = containers.Map();
- end
- methods
- function put(obj,var,expr)
- obj.variables(char(var)) = expr;
- end
- function expr = lookup(obj,var)
- if(obj.variables.isKey(char(var)))
- expr = obj.variables(char(var));
- else
- expr = Expression.empty();
- end
- end
- end
- end
Expression.m (抽象表达式)
- classdef Expression < handle & matlab.mixin.Heterogeneous
- methods(Abstract)
- interpret(obj,ctx);
- end
- end
Plus.m (非终结表达式,加法类)
- classdef Plus < Expression
- properties
- left;
- right;
- end
- methods
- function obj = Plus(left,right)
- obj.left = left;
- obj.right = right;
- end
- function res = interpret(obj,ctx)
- res = obj.left.interpret(ctx) + obj.right.interpret(ctx);
- end
- end
- end
Minus.m (非终结表达式,减法类)
- classdef Minus < Expression
- properties
- left;
- right;
- end
- methods
- function obj = Minus(left,right)
- obj.left = left;
- obj.right = right;
- end
- function res = interpret(obj,ctx)
- res = obj.left.interpret(ctx) - obj.right.interpret(ctx);
- end
- end
- end
Variable.m (非终结表达式,变量类)
- classdef Variable < Expression
- properties
- name
- end
- methods
- function obj = Variable(name)
- obj.name = name;
- end
- function res = interpret(obj,ctx)
- if(isempty(ctx.lookup(obj.name)))
- res = 0;
- else
- res = ctx.lookup(obj.name).interpret(ctx);
- end
- end
- end
- end
Number.m (终结表达式,数字类)
- classdef Number < Expression
- properties
- number
- end
- methods
- function obj = Number(number)
- obj.number = number;
- end
- function number = interpret(obj,~)
- number = obj.number;
- end
- end
- end
Evaluator.m (非终结表达式,解析入口类)
- classdef Evaluator < Expression
- properties
- syntaxTree
- end
- methods
- function obj = Evaluator(expr)
- exprs = Expression.empty();
- tokens = expr.split(" ");
- for i=1:length(tokens)
- switch(tokens(i))
- case "+"
- subexpr = Plus(exprs(end-1),exprs(end));
- exprs = exprs(1:end-2);
- exprs(end + 1) = subexpr;
- case "-"
- subexpr = Minus(exprs(end-1),exprs(end));
- exprs = exprs(1:end-2);
- exprs(end + 1) = subexpr;
- otherwise
- exprs(end + 1) = Variable(tokens(i));
- end
- end
- obj.syntaxTree = exprs(end);
- end
- function res = interpret(obj,ctx)
- res = obj.syntaxTree.interpret(ctx);
- end
- end
- end
test.m (测试代码)
- expr = "w x z + -";
- ctx = Context();
- ctx.put("w",Number(5));
- ctx.put("x",Number(6));
- ctx.put("z",Number(4));
- eva = Evaluator(expr);
- res = eva.interpret(ctx);
- disp(res);
参考资料:
https://www.jianshu.com/p/0e7e26bbe204
https://www.cnblogs.com/chenpi/p/5222496.html
Matlab解释器模式的更多相关文章
- interpreter(解释器模式)
一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用 ...
- php实现设计模式之 解释器模式
<?php /* * 解释器模式:给定一种语言,定义它文法的一种表示,并定义一个解释器,该解释器利用该表示来解释语言中的句子 * */ class Expression { function i ...
- [工作中的设计模式]解释器模式模式Interpreter
一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...
- 解释器模式(Interpreter Pattern)
定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...
- C#设计模式——解释器模式(Interpreter Pattern)
一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...
- JAVA 设计模式 解释器模式
用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构
- 深入浅出设计模式——解释器模式(Interpreter Pattern)
模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...
- JAVA设计模式之解释器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...
- 【GOF23设计模式】解释器模式 & 访问者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter 2.访问者模式Visitor
随机推荐
- LCD裸板编程_框架
lcd程序框架: 为了让程序更好的扩展,介绍面向对象编程: 比如抽象出lcd_3.5和lcd_4.3的共同点: 当我想使用3.5寸的lcd时,只需让lo指向lcd_3.5_opr即可.同样,当我想使用 ...
- 修改opencart extension插件代码后无法重新安装的解决办法
有时我们在为opencart安装一些插件后,发现有些地方需要细微的调整,然后去修改插件代码重新安装,但是却没有成功.开始有点怀疑是不是不能修改代码,但也不至于啊,不然开发者怎么制作插件.应该是哪里出了 ...
- Java 内存分配(转)
Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性. 寄存器:JVM内部虚拟寄 ...
- html-前端内容初识
HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的规则(W3C),大家都来遵守他,这 ...
- Windows server 2003 粘滞键后门+提权
Windows server 2003中可以建立粘滞键与cmd的连接来绕过已经设置好的安全机制做一些事情,比如新建用户.提权 粘滞键介绍 网上查了一些资料,也没怎么说明白,不如自己试一下,大概意思就是 ...
- HBase快照迁移数据失败原因及解决办法
目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...
- docker 部署 jenkins
建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository). 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 ...
- 通过rpm安装crontab
可以在对应的虚拟机centos上查看 所安装的crontab安装信息,然后选中rpm包进行安装,命令:rpm -qa |grep cron 如: 如没有上述信息,表名没有安装,也可以直接用cronta ...
- mac下编程使用字体
1.xcode下使用的是Menlo的18号字体 2.webStorm使用的也是Menlo的18号字体 3.sublime Text 使用的也是Menlo的21号字体
- 【Gamma】Scrum Meeting 8
前言 会议定点:大运村公寓 会议时间:2019/6/7 会议目的:分配任务,准备宣传 一.任务进度 组员 上周任务进度 下阶段任务 大娃 辅助做好引导录屏 优化辅助模型 二娃 撰写会议博客 撰写会议博 ...