Interpreter パターン
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Interpreter パターンは、コンピュータプログラミングにおけるデザインパターンの一つである。Interpreter パターンの基本的な考えは、定義された種類の問題を素早く解くために、ドメインに特化した言語を実装することである。特化言語は汎用の言語よりも数倍から数百倍高速に問題を解ける場合が多い。
一般的な方法としては、各シンボル(終端記号と非終端記号)ごとにクラスを持つ。
目次 |
[編集] 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()); } }
[編集] 関連項目
- バッカス・ナウア記法
- ドメイン固有言語
- Design Patterns p. 243
|
|
---|---|
生成に関するパターン | Abstract Factory | Builder | Factory Method | Prototype | Singleton |
構造に関するパターン | Adapter | Bridge | Composite | Decorator | Facade | Flyweight | Proxy |
振る舞いに関するパターン | Chain of Responsibility | Command | Interpreter | Iterator | Mediator | Memento | Observer | State | Strategy | Template Method | Visitor |