解释器模式--自定义语言翻译机(行为模式03)

什么是行为模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
文法和解释器是编译原理课程中的术语,这里我们说的通俗一点,以例子来说明。语法好比我们编写Java中的class{}类,然而计算机并不识别,我们想要让他识别就需要安装jdk来做解释,jvm就相比是解释器。从而让我们写的代码可以运行在计算机上。

行为模式的适用场景

  1. 如果一个简单语言需要通过翻译,使得固定语句成为语法树。
  2. 某领域重复出现相似问题。

行为模式角色介绍

  • AbstractExpression:抽象表达式
  • TerminalExpression:终结符表达式
  • NonterminalExpression:非终结符表达式
  • Context:上下文环境
  • Client:客户类

解释器模式用例
我们输入123456,输出是“abcdef ”,这里输入是平常123456但是我们的自定义的语法解释器确是把他解释成另外一种意思。

UML类图
这里写图片描述

AbstractInterpreter类:

public abstract class AbstractInterpreter {
    abstract void interpreter(Context context);
}

Context:

public class Context {
    String myNumNotation;
}

Number:

public class Number extends AbstractInterpreter {

    Hashtable map = new Hashtable();
    Number(){
        map.put("1", "a");
        map.put("2", "b");
        map.put("3", "c");
        map.put("4", "d");
        map.put("5", "e");
        map.put("6", "f");
    }
    @Override
    void interpreter(Interpreter.Context context) {
        String s = context.myNumNotation;
        for(int i = 0;i <s.length();i++){
            //截取i位置的字符串
            String subs = s.substring(i,i+1);
            //从table中获取对应的value值并输出
            String r = map.get(subs).toString();
            System.out.print(r);
        }

    }

}

主类测试:

public class Test {

    public static void main(String[] args) {
        Context context = new Context();
        context.myNumNotation = "214536";

        Number nn = new Number();
        nn.interpreter(context);
    }

}

测试结果:

badecf

解释器模式总结
解释器模式在简单的语言中使用,如果语言复杂,比如对应1+2*3+(4+3/2)^3像这样的语法结构要考虑的太多了,解释起来也很棘手。通常具体的文法规则和解释器是一一对应的关系,解释器的本质:将复杂的问题简单化、模块化、分离实现、解释执行。
解释器模式的优点在于高扩展性,当我们需要其他相应解释器,只需要扩展相应解释器即可,比如我们要增加将123456解释为Do、Re、mi、Fa、So、La只需要增加对应的解释器即可。缺点在于对于每一条文法都需要相应的解释器,如果文法过多,会生成大量的类,后期维护困难,对于复杂的文法,实现起来也是比较吃力的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值