天天看點

解釋器模式

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、模式适用環境

在下面情況下能夠使用解釋器模式:

能夠将一個須要解釋運作的語言中的句子表示為一個抽象文法樹。

一些反複出現的問題能夠用一種簡單的語言來進行表達。

文法較為簡單。

效率不是關鍵問題。

繼續閱讀