解释器模式

Interpreter,解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发
编译器中;在实际应用中,我们可能很少碰到去构造一个语言的文法的情况。
解释器模式的定义如下:定义语言的文法,并且建立一个解释器来解释该语言中的句子。
它属于类的行为模式。这里的语言意思是使用规定格式和语法的代码。
在GOF 的书中指出:如果一种特定类型的问题发生的频率足够高,那么可能就值得将
该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通
过解释这些句子来解决该问题。而且当文法简单、效率不是关键问题的时候效果最好——这
也就是解释器模式适用的环境。
让我们来看看神秘的解释器模式是由什么来组成的吧。
1) 抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语
法树中的节点)都要实现的。
什么叫做抽象语法树呢?《java 与模式》中给的解释为:抽象语法树的每一个节点都
代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的执行就代表这个
语句被解释。由于每一个语句都代表这个语句被解释。由于每一个语句都代表一个常见
的问题的实例,因此每一个节点上的解释操作都代表对一个问题实例的解答。
2) 终结符表达式角色:具体表达式。
a) 实现与文法中的终结符相关联的解释操作
b) 而且句子中的每个终结符需要该类的一个实例与之对应
3) 非终结符表达式角色:具体表达式。
a) 文法中的每条规则R::=R1R2…Rn 都需要一个非终结符表带式角色
b) 对于从R1 到Rn 的每个符号都维护一个抽象表达式角色的实例变量
c) 实现解释操作,解释一般要递归地调用表示从R1 到Rn 的那些对象的解释操作
4) 上下文(环境)角色:包含解释器之外的一些全局信息。
5) 客户角色:
a) 构建(或者被给定)表示该文法定义的语言中的一个特定的句子的抽象语法树
b) 调用解释操作

解释器是一个比较少用的模式,以下为其通用源码,可以做为参考。抽象表达式通常只有一个方法,
如下:
 
public abstract class Expression {
//每个表达式必须有一个解析任务
public abstract Object interpreter(Context ctx);
}
抽象表达式是生成语法集合(也叫做语法树)的关键,每个语法集合完成指定语法解析任务,它是通
过迭代调用的方式,最终由最小的语法单元进行解析完成。终结符表达式如下:
public class TerminalExpression extends Expression {
//通常终结符表达式只有一个,但是有多个对象
public Object interpreter(Context ctx) {
您的设计模式
第 295 页
return null;
}
}
通常终结符表达式比较简单,主要是处理场景元素和数据的转换。非终结表达式如下:
[code="java"]

public class NonterminalExpression extends Expression {
//每个非终结符表达式都会对其他表达式产生依赖
public NonterminalExpression(Expression... expression){
}
public Object interpreter(Context ctx) {
//进行文法处理
return null;
}
}
每个非终结符表达式都代表了一个文法规则,并且每个文法规则都只关心自己周边的文法规则的结果,
注意是结果,因此这就产生了每个非终结符调用自己周边的非终结符,然后最终最小的文法规则就是终结
符表达式,终结符表达式的概念就是如此,不能够再参与比自己更小的文法运算了。我们再来看Client 类:
public class Client {
public static void main(String[] args) {
Context ctx = new Context();
//通常定一个语法容器,容纳一个具体的表达式,通常为ListArray,LinkedList,Stack等类

Stack<Expression> stack = null;
for(;;){
//进行语法判断,并产生递归调用
}
//产生一个完整的语法树,由各各个具体的语法分析进行解析
Expression exp = stack.pop();
//具体元素进入场景
exp.interpreter(ctx);
}
}

[/code]

通常Client 是一个封装类,封装的结果就是传递进来一个规范语法文件,解析器分析后产生结果并返
回,避免了调用者与语法解析器的耦合关系。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值