经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Matlab解释器模式 - sw-lab
来源:cnblogs  作者:sw-lab  时间:2019/6/10 13:43:45  对本文有异议

解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析

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);

参考资料:

https://www.jianshu.com/p/0e7e26bbe204

https://www.cnblogs.com/chenpi/p/5222496.html

 

原文链接:http://www.cnblogs.com/usaddew/p/10993711.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号