设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1487|回复: 0

Matlab解释器模式

[复制链接]

20

主题

176

金钱

290

积分

入门用户

发表于 2019-9-4 16:30:30 | 显示全部楼层 |阅读模式

解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析。
1.png
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);
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表