Matlab解释器模式
程序员文章站
2022-06-29 07:53:13
解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析。 Context.m (环境类,包含解释器 ......
解释器模式(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);
参考资料:
上一篇: 使用 python 进行微信好友分析
下一篇: SQL(结构化查询语言)