首页 > 代码库 > 解释器模式

解释器模式

1、模式定义

解释器模式(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、模式适用环境
在以下情况下可以使用解释器模式:
可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
一些重复出现的问题可以用一种简单的语言来进行表达。
文法较为简单。 
效率不是关键问题。

解释器模式