设计思想学习—解释器模式

解释器模式

解释器模式是最后一个模式了,而且接触到的名词也多,所以会把定义、UML和结构一起列完之后,统一说明理解。

解释器模式(Interpreter):给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

UML
这里写图片描述

解释模式构成

  • 抽象表达式(AbstractExpression):声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。

  • 终结符表达式(TerminalExpression):实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。

  • 非终结符表达式(NonterminalExpression):为文法中的非终结符相关的解释操作。

  • 环境类(Context):包含解释器之外的一些全局信息。

这里需要解释的有
文法:文章的书写法规,就是跟法律差不多的东西,法律约束人的行为,文法约束书写的规矩。
解释器:简单的可以理解为翻译器,按照特定文法来翻译。
抽象语法树:是语法树状结构的表达,比如3+1-2
这里写图片描述
终结符:终结符就是最基本的元素不能再分解,上图树状图中的数字也就是叶子都是终结符。
非终结符:非终结符就刚好相反了,对应树状图的符号也就是树枝。

就拿3+1-2的例子来说吧!这个是人类定义的语法计算肯定不能识别,所以要经过解码器翻译。

代码表示


interface Node{
    int interpreter();
}
class Value implements Node{
    private int value;
    public Value(int value){
        this.value=value;
    }
    @Override
    public int interpreter() {
        return value;
    }
}
class Add implements Node{
    private int left;
    private int right;
    public Add(int left,int right){
        this.left=left;
        this.right=right;
    }
    @Override
    public int interpreter() {
        return left+right;
    }   
}
class Sub implements Node{
    private int left;
    private int right;
    public Sub(int left,int right){
        this.left=left;
        this.right=right;
    }
    @Override
    public int interpreter() {
        return left-right;
    }   
}
class Context{
    private String statement;
    private Node num;
    private int score=0;
    public void setStatement(String statement) {
        this.statement = statement;
    }
    public int compute(){
        String[] str=statement.split("");
        score=Integer.valueOf(str[0]);
        for(int i=1;i<str.length;i++){
            if(i%2!=0){
                num=new Value(Integer.valueOf(str[(i+1)]));
                if("+".equals(str[i])){
                    score+=num.interpreter();
                }else{
                    score-=num.interpreter();
                }   
            }   
        }
        return score;
    }
}
public class Client {
    public static void main(String[] args) {
        String statement="3+1-2";
        Context context=new Context();
        context.setStatement(statement);
        int scroe=context.compute();
        System.out.println(scroe);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值