解释器模式

解释器模式是一种行为设计模式,用于对特定语言的句子进行解释。它定义了语言的文法,并提供了解释器来解释这些句子。模式包括抽象表达式、终结符表达式和非终结符表达式角色,以及环境角色。应用场景如SQL、XML和正则表达式的解析。在代码示例中,展示了如何将数学表达式如a+b-c转化为抽象语法树并进行解释。
摘要由CSDN通过智能技术生成

定义

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

应用场景

对于一些固定文法构建一个解释句子的解释器,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。例如:SQL、XML、正则解析。

解释器模式的结构

  • 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

  • 终结符表达式(Terminal Expression)角色:是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

  • 非终结符表达式(Nonterminal Expression)角色:也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

  • 环境(Context)角色:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

  • 客户端(Client):主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树,然后调用解释器的解释方法,当然也可以通过环境角色间接访问解释器的解释方法。

代码示例

a+b-c abc 是终结表达式,±符号是非终结表达式,HashMap转换的定义,比如abc是键盘上的按键,对应输入数字为 3,7,9

//抽象表达式
public interface Expression {

    int interprete(HashMap<String, Integer> exp);
}
//非终结表达式
public class AddExpression implements Expression {

    private Expression left;

    private Expression right;

    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interprete(HashMap<String, Integer> exp) {
        return left.interprete(exp) + right.interprete(exp);
    }
}
//非终结表达式
public class SubExpression implements Expression {

    private Expression left;

    private Expression right;

    public SubExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interprete(HashMap<String, Integer> exp) {
        return left.interprete(exp) - right.interprete(exp);
    }
}
//终结表达式
public class VarExpression implements Expression {

    private String key;


    public VarExpression(String key) {
        this.key = key;
    }

    @Override
    public int interprete(HashMap<String, Integer> exp) {
        return exp.get(key);
    }
}
public class Test {

    public static void main(String[] args) {
    	//定义符号解释
        HashMap<String, Integer> context = new HashMap<String, Integer>();
        context.put("a", 3);
        context.put("b", 7);
        context.put("c", 9);
        context.put("d", 12);
        context.put("e", 5);

        //a+b-c
        //省略解析a+b-c
        //abc终结符
        Expression avarExpression = new VarExpression("a");
        Expression bvarExpression = new VarExpression("b");
        Expression cvarExpression = new VarExpression("c");
        //+-非终结符
        AddExpression addExpression = new AddExpression(avarExpression, bvarExpression);
        SubExpression subExpression = new SubExpression(addExpression, cvarExpression);
        System.out.println("结果=" + subExpression.interprete(context));
    }

}

结果输出
结果=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值