解释器模式(Interpreter Pattern) :定义语言的文法,而且建立一个解释器来解释该语言中的句子。这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。
2、模式结构
解释器模式包括例如以下角色:
AbstractExpression: 抽象表达式
TerminalExpression: 终结符表达式
NonterminalExpression: 非终结符表达式
Context: 环境类
Client: 客户类
3、模式分析
解释器模式描写叙述了怎样为简单的语言定义一个文法,怎样在该语言中表示一个句子,以及怎样解释这些句子。
文法规则实例:
expression ::= value | symbol
symbol ::= expression '+' expression | expression '-' expression
value ::= an integer //一个整数值
在文法规则定义中能够使用一些符号来表示不同的含义。如使用“|”表示或。使用“{”和“}”表示组合。使用“*”表示出现0次或多次等,当中使用频率最高的符号是表示或关系的“|” 。
抽象语法树描写叙述了怎样构成一个复杂的句子,通过对抽象语法树的分析。能够识别出语言中的终结符和非终结符类。
在解释器模式中,每一种终结符和非终结符都有一个详细类与之相应,正由于使用类来表示每个语法规则,使得系统具有较好的扩展性和灵活性。
典型的抽象表达式类实现代码:
public abstract class AbstractExpression { public abstract void interpret(Context ctx); }典型的终结符表达式类实现代码:
public class TerminalExpression extends AbstractExpression { public void interpret(Context ctx) { //对于终结符表达式的解释操作 } }
典型的非终结符表达式类实现代码:
public class NonterminalExpression extends AbstractExpression { private AbstractExpression left; private AbstractExpression right; public NonterminalExpression(AbstractExpression left,AbstractExpression right) { this.left=left; this.right=right; } public void interpret(Context ctx) { //递归调用每个组成部分的interpret()方法 //在递归调用时指定组成部分的连接方式。即非终结符的功能 } }
典型的环境类实现代码:
public class Context { private HashMap map = new HashMap(); public void assign(String key, String value) { //往环境类中设值 } public String lookup(String key) { //获取存储在环境类中的值 } }
4、模式优缺点
解释器模式的长处
易于改变和扩展文法。
易于实现文法。
添加了新的解释表达式的方式。
解释器模式的缺点
对于复杂文法难以维护。
运行效率较低。
应用场景非常有限
5、模式适用环境
在下面情况下能够使用解释器模式:
能够将一个须要解释运行的语言中的句子表示为一个抽象语法树。
一些反复出现的问题能够用一种简单的语言来进行表达。
文法较为简单。
效率不是关键问题。