解释器模式(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解释器模式的更多相关文章

  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. jQuery的Promise 这里介绍的很详细

    原文电梯:https://www.cnblogs.com/yelongsan/p/7644239.html 先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuer ...

  2. 知识点6 C++数据类型转换 string

    一.int转string 1.c++11标准增加了全局函数std::to_string: string to_string (int val); string to_string (long val) ...

  3. sublime3插件BracketHighlighter的配置

    BracketHighlighter插件能为Sublime Text提供括号,引号这类高亮功能,但安装此插件后,默认没有高亮,只有下划线表示,不是很醒目,需要配置:1.在Sublime Text中用p ...

  4. 洛谷p1776宝物筛选

    宝物筛选 多重背包问题 物品数目已知 可以枚举每个物品 当做01背包来做 不过会超时 此时需要二进制拆分来优化 分解成新的物品 再跑一遍01背包即可 //二进制拆分+01背包 //设f[j]表示前i件 ...

  5. Salesforce 开发整理(二)报表开发学习

    Salesforce提供了强大的报表功能,支持表格.摘要.矩阵以及结合共四种形式,本文探讨在站在开发的角度要如何理解报表. 一:查询报表基本信息报表在Sales force中是Report对象,基本的 ...

  6. Java 集合系列之四:Queue基本操作

    1. Java Queue 1. Java Queue 重要观点 Java Queue接口是Java Collections Framework的成员. Queue 实现通常不允许插入 null 元素 ...

  7. VS C++代码能正确编译 但还是显示红色波浪线 提示"无法打开源文件"

    症状细节 我发现很多第三方库的环境部署教程,都会教读者配置 属性VC++目录 -> 包含目录 比如OpenCV的环境配置教程. 这样配置之后能通过编译: 但是,在IDE里,会有一些烦人的红波浪线 ...

  8. 【Gamma】事后分析

    目录 [Gamma]事后分析 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 照片 [Gamma]事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清 ...

  9. Sourcetree 集成 Azure DevOps Server(Git)

    概述- SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是Mercurial和Subversion版本控制系统工具.支持创建.克隆.提交 ...

  10. spark 存取mysql

    1.先上代码,存入mysql val spark = SparkSession.builder() .appName("jdbc") .getOrCreate() import s ...