Interpreter パターン

Interpreter パターンは、コンピュータプログラミングにおけるデザインパターンの一つである。Interpreter パターンの基本的な考えは、定義された種類の問題を素早く解くために、Compositパターンを使って ドメイン固有言語を実装することである。特化言語は汎用の言語よりも数倍から数百倍高速に問題を解ける場合が多い。

Interpreter パターンの使用例

  • データベースに特化した問い合わせ言語(SQLなど)
  • 通信プロトコルを記述するために良く用いられる特化したコンピュータ言語
  • 特化言語を導入した汎用のコンピュータ言語

Java

以下の Java の例は、汎用のプログラミング言語がより特化した言語を解釈する例を、ここでは 逆ポーランド記法 を用いて示す。

入力:

'42 4 2 - +' equals 44

パーサー:

import java.util.*;
 
interface Expression {
    public void interpret(Stack<Integer> s);
}
 
class TerminalExpression_Number implements Expression {
    private int number;
    public TerminalExpression_Number(int number)       { this.number = number; }
    public void interpret(Stack<Integer> s)  { s.push(number); }
}
 
class TerminalExpression_Plus implements Expression {
    public void interpret(Stack<Integer> s)  { s.push( s.pop() + s.pop() ); }
}
 
class TerminalExpression_Minus implements Expression {
    public void interpret(Stack<Integer> s)  { s.push( - s.pop() + s.pop() ); }
}
  
class Parser {
    private ArrayList<Expression> parseTree = new ArrayList<Expression>(); // only one NonTerminal Expression here
 
    public Parser(String s) {
        for (String token : s.split(" ")) {
            if      (token.equals("+")) parseTree.add( new TerminalExpression_Plus() );
            else if (token.equals("-")) parseTree.add( new TerminalExpression_Minus() );
            // ...
            else                        parseTree.add( new TerminalExpression_Number(Integer.valueOf(token)) );
        }
    }
 
    public int evaluate() {
        Stack<Integer> context = new Stack<Integer>(); 
        for (Expression e : parseTree) e.interpret(context);
        return context.pop();
    }
}
 
class InterpreterExample {
    public static void main(String[] args) {
        // ここで上述の式を評価している 
        String expression = "42 4 2 - +";
        Parser p = new Parser(expression);
        System.out.println("'" + expression +"' equals " + p.evaluate());
    }
}

関連項目

デザインパターン
GoFによる23種のパターン
生成に関するパターン
構造に関するパターン
振る舞いに関するパターン
並行性に関するパターン
  • Active object(英語版)
  • Balking(英語版)
  • Double-checked locking(英語版)
  • Event-based asynchronous(英語版)
  • Guarded suspension(英語版)
  • Join(英語版)
  • ロック
  • モニタ
  • Proactor(英語版)
  • Reactor
  • Readers–writer lock(英語版)
  • Scheduler(英語版)
  • Thread pool(英語版)
  • スレッド局所記憶
アーキテクチャに関するパターン
その他のパターン
関連する人々
関連項目
  • 一覧記事一覧
  • カテゴリカテゴリ
  • コモンズコモンズ
  • 表示
  • 編集