当前位置: 移动技术网 > IT编程>软件设计>设计模式 > Matlab解释器模式

Matlab解释器模式

2019年06月10日  | 移动技术网IT编程  | 我要评论

解释器模式(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);

参考资料:

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网