适配器模式之解释器模式

    xiaoxiao2026-02-24  6

    设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox

    解释器模式 Interpreter Pattern

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

    通用类图

    组成

    抽象解释器 AbstractExpression 具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和NonterminalExpression完成。终结符表达式 TerminalExpression 实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。具体到我们例子就是VarExpression类,表达式中的每个终结符都在堆栈中产生了一个VarExpression对象。非终结符表达式 NonterminalExpression 文法中的每条规则对应于一个非终结表达式,具体到我们的例子就是加减法规则分别对应到AddExpression和SubExpression两个类。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。环境角色 Context

    通用源码

    JAVA

    //抽象表达式 public abstract class Expression { //每个表达式必须有一个解析任务 public abstract Object interpreter(Context ctx); } //终结符表达式 public class TerminalExpression extends Expression[ //通常终结符表达式只有一个,但是有多个对象 public Object interpreter(Context ctx){ return null; } } //非终结符表达式 public class NonterminalExpression extends Expression[ //每个终结符表达式都会对其他表达式产生依赖 public NonterminalExpression(Expression... expression){ } public Object interpreter(Context ctx){ //进行文法处理 return null; } } //场景 public class Client{ public static void main(String[] arg){ Context ctx = new Context(); //通常定义一个语法容器,容纳一个具体的表达式,通常为ListArray,LinkedList,Stack等等 Stack&Expression>stack =null; for(;;){ ..... } //产生一个完整的语法树,由各个具体的语法分析进行解析 Expression exp=stack.pop(); //具体元素进入场景 exp.interpreter(ctx); } }

    使用场景

    重复发生的问题 一个简单语法需要解释的场景

    最新回复(0)