设计模式目录
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);
}
}
使用场景
重复发生的问题
一个简单语法需要解释的场景
时间: 2025-01-31 07:06:40