设计模式(十六) 解释器模式-阿里云开发者社区

开发者社区> 过了即是客> 正文

设计模式(十六) 解释器模式

简介: 解释器模式是一种行为型模式,它的主要作用是用一种方式来实现对表达式或文法的处理。我们可以使用解释器模式处理语言的解析,在设计计算机语言的时候解释器模式很有用处。
+关注继续查看

解释器模式是一种行为型模式,它的主要作用是用一种方式来实现对表达式或文法的处理。我们可以使用解释器模式处理语言的解析,在设计计算机语言的时候解释器模式很有用处。

解释器模式可能需要用到一点编译原理的知识。不过我自己编译原理的内容都忘光了,所以这里不做编译原理的任何介绍了。直接来看代码吧。我们来做一个不含括号的四则运算的解释器。

解释器模式首先需要一个表达式接口,其中有一个方法用于解析表达式的值。

public interface Expression {
    int interpret(Context context);
}

之后来考虑一些具体的表达式。首先是常量表达式,这个很简单,直接返回常量的值即可。

class Constant implements Expression {
    private int i;

    public Constant(int i) {
        this.i = i;
    }

    @Override
    public int interpret(Context context) {
        return i;
    }
}

然后是变量,变量的值保存在上下文中,在编译领域也可以叫做符号表之类的,反正都是一个意思。

class Variable implements Expression {
    @Override
    public int interpret(Context context) {
        return context.getValue(this);
    }
}

上下文,或者叫符号表,是保存变量值的地方。我们在Java中可以简单的使用Map来当做符号表。

public class Context {
    private HashMap<Variable, Integer> map = new HashMap<>();

    public void putValue(Variable name, int value) {
        map.put(name, value);
    }

    public int getValue(Variable name) {
        return map.get(name);
    }
}

然后是加减乘除四种表达式。这个非常简单,没啥说的吧。

class Add implements Expression {
    private Expression a, b;

    public Add(Expression a, Expression b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int interpret(Context context) {
        return a.interpret(context) + b.interpret(context);
    }
}

class Sub implements Expression {
    private Expression a, b;

    public Sub(Expression a, Expression b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int interpret(Context context) {
        return a.interpret(context) - b.interpret(context);
    }
}

class Mul implements Expression {
    private Expression a, b;

    public Mul(Expression a, Expression b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int interpret(Context context) {
        return a.interpret(context) * b.interpret(context);
    }
}

class Div implements Expression {
    private Expression a, b;

    public Div(Expression a, Expression b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public int interpret(Context context) {
        return a.interpret(context) / b.interpret(context);
    }
}

这些类都准备好之后,我们就可以测试一下解释器模式了。我们手动创建一个表达式,然后调用它的interpret()方法对其求值。之后,表达式就会如我们所愿的给出结果。

    public void run() {
        Variable a = new Variable();
        Variable b = new Variable();
        Context context = new Context();
        context.putValue(a, 3);
        context.putValue(b, 4);

        //a+b*(a-b)+2
        Expression expression = new Add(a, new Add(new Mul(b, new Sub(a, b)), new Constant(2)));
        System.out.println("a+b*(a-b)+2=" + expression.interpret(context));
    }

当然,这只是一个非常简单的小例子,因为new Add(a, new Add(new Mul(b, new Sub(a, b)), new Constant(2)))这个表达式树是我们手动创建的。如果我们希望更加实用的话,就需要自己编写程序,解析字符串,然后转换为抽象语法树。这就属于编译原理的话题了。

参考资料:设计模式(行为型)之解释器模式(Interpreter Pattern)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java描述设计模式(14):解释器模式
本文源码:GitHub·点这里 || GitEE·点这里 一、解释器模式 1、基础概念 解释器模式是对象的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的表达式。
902 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
7238 0
乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作者:webabcd 介绍 给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
904 0
python设计模式(十三):解释器模式
此前已经将创造型模式、结构性模式分享了,后面将分享模式设计中的另一种典型模式:行为型模式。 创造型模式是解决实体的生成问题、结构性模式是为了解决实体的组合、搭配问题 ,而行为型设计模式的出现是为了解决不同实体通信的问题。
939 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
8919 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
10522 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
5824 0
+关注
过了即是客
一个普普通通的程序员
219
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载