欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Matlab解释器模式

程序员文章站 2022-06-29 07:53:13
解释器模式(Interperter),给定一个语言,定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,实际开发中EL表达式或者正则表达式的解释器就是采用这种设计模式。其模式结构如下图。本文使用matlab语言,利用解释器模式来实现后缀表达式的解析。 Context.m (环境类,包含解释器 ......

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

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

参考资料: