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
随机推荐
- HTTP协议的异步通信
get 请求 1)创建一个XMLHttpRequest对象 2)调用该对象的open方法 3)如果是get请求,设置回调函数onreadystatechange = callback 4)Send 如 ...
- 线程全局修改、死锁、递归锁、信号量、GIL以及多进程和多线程的比较
线程全局修改 x = 100 def func1(): global x print(x) changex() print(x) def changex(): global x x = 50 func ...
- HTML基础四-VUE
一.VUE VUE官网:https://cn.vuejs.org/v2/guide/ 1.1 Vue简介 VUE与JS的区别 VUE在JS的基础上进行了优化 增加VUE最强大的特点,对数据操作特别的友 ...
- Centos7安装MySQL(多图)
文章目录 一.在线安装1.替换网易yum源2.清理缓存3.下载rpm文件4.安装MySQL数据库二.本地安装1.上传MySQL安装包2.安装依赖的程序包3.卸载mariadb程序包4.安装MySQL程 ...
- win +R
一.电脑设置免登录密码及修改密码 1.win+R 2.输入control userpasswords2 3.勾选免密码账号登陆,修改密码 二.打开性能监视器 1.win+R 2.输入perfmon.e ...
- 数据结构——单链表(singly linked list)
/* singlyLinkedList.c */ /* 单链表 */ /* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. */ #include <stdio ...
- CF264D - Colorful Stones 题解
题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...
- 学好Python后可从事岗位+学习Python的难度
一.学好Python好就业: 1.Linux运维.Linux运维是必须而且一定要掌握Python语言,Python可以满足Linux运维工程师的工作需求提升效率,总而提升自己的能力.用Python实现 ...
- ZROI 暑期高端峰会 A班 Day2 线性代数
高斯消元 很普及组,不讲了 当主元没有逆的时候可以辗转相除. 如果也没有带余数除法--没救了 逆矩阵 我们定义矩阵 \(A\) 的逆矩阵为 \(A^{-1}\),满足 \(AA^{-1}=A^{-1} ...
- cad.net 合并图层错误 ctrl+u出错 !dbenti.cpp@3310:eWasErased错误
(左边这段代码的两个事务是单独的事务,没有被另一个大的事务包裹) ...