设计模式--解释器模式

简介

解释器模式基本介绍
1)在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过词法分析器构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。
2)解释器模式(Interpreter Pattern):是一种行为模式,指给定一个语言表达式,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(表达式)
在这里插入图片描述

角色

抽象表达式角色(Expression):声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称作解释操作。
终结符表达式角色(Terminal Expression):实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面的R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。
非终结表达式角色(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。
环境角色(Context):这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息都需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就够了。

简单示例

(不包含终结符表达式角色(Terminal Expression))

1.创建抽象表达式角色(Expression)。

public abstract class Expression {
    Context context;

    public abstract void interpret(Context context);
}

2.创建所需环境角色(Context)

public class Context {
    private String input;
    private String output;

    public Context(String input) {
        this.input = input;
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public String getOutput() {
        return output;
    }

    public void setOutput(String output) {
        this.output = output;
    }

    @Override
    public String toString() {
        return "Context{" +
                "input='" + input + '\'' +
                ", output='" + output + '\'' +
                '}';
    }
}

3.创建非终结符表达式(NonterminalExpression)

// -1 表达式
public class Expression1 extends  Expression{
    @Override
    public void interpret(Context context) {

        this.context = context;
        String input = context.getInput();
        int in = Integer.valueOf(input);
        context.setOutput(Integer.toString(in - 1));

    }

    @Override
    public String toString() {
        return "--"+context.getInput()+"="+context.getOutput();
    }

}

//+1 表达式
public class Expression2 extends Expression{
    @Override
    public void interpret(Context context) {

        this.context = context;
        String input = context.getInput();
        int in = Integer.valueOf(input);
        context.setOutput(Integer.toString(in+1));
    }
    @Override
    public String toString() {
        return "++"+context.getInput()+"="+context.getOutput();
    }
}

4.Client(Main)

public class Main {
    public static void main(String[] args) {
        Context context = new Context("50");
        Expression e1 = new Expression1();
        Expression e2 = new Expression2();

        e1.interpret(context);
        System.out.println(e1.toString());

        e2.interpret(context);
        System.out.println(e2.toString());
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值