您的位置:首页 > 其它

设计模式(15)-行为型-解释器模式(Interpreter)

2012-11-22 06:59 701 查看

概述

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

适用性

当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。

参与者

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

    2.TerminalExpression(终结符表达式)
      实现与文法中的终结符相关联的解释操作。
      一个句子中的每个终结符需要该类的一个实例。

    3.NonterminalExpression(非终结符表达式)
      为文法中的非终结符实现解释(Interpret)操作。

    4.Context(上下文)
      包含解释器之外的一些全局信息。

    5.Client(客户)
      构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。
      该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
      调用解释操作。

示例:

一个bool表达式和日期表达式解释器对上下文进行解释.

package com.sql9.actioned;

import java.text.ParseException;

abstract class Expression {
    String val;
    public abstract void interpret(Context ctx);
}

class BoolExpression extends Expression {
    public BoolExpression(String val) {
        super.val = val;
    }
    @Override
    public void interpret(Context ctx) {
        boolean v = Boolean.valueOf(ctx.exp.val);
        System.out.println("value parsed in BoolExpression is: " + v);
    }
}

class DateExpression extends Expression {
    public DateExpression(String val) {
        super.val = val;
    }
    @Override
    public void interpret(Context ctx) {
        String v = ctx.exp.val;
        try {
            java.util.Date date = new java.text.SimpleDateFormat("yyy-mm-dd").parse(v);
            System.out.println("DateExpression parsed value: " + date);
        } catch (ParseException e) {
            System.out.println("Invalid date in the source value parsed in DateExpression");
        }
    }
    
}

class Context {
    Expression exp;
    public void assign(Expression exp) {
        this.exp = exp;
    }
}

public class InterpreterTest {

    public static void main(String[] args) {
        Expression exp = new BoolExpression("false");
        Context context = new Context();
        context.assign(exp);
        exp.interpret(context);
        
        exp = new DateExpression("2008-09-01");
        context.assign(exp);
        exp.interpret(context);
    }

}


结果

value parsed in BoolExpression is: false
DateExpression parsed value: Tue Jan 01 00:09:00 CST 2008
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: