| sitelink1 | |
|---|---|
| sitelink2 | |
| sitelink3 | http://1 |
| extra_vars4 | ko |
| extra_vars5 | |
| extra_vars6 | sitelink1 |
Interpreter pattern
|
|
This article does not cite any references or sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. (November 2008) |
In computer programming, the interpreter pattern is a particular design pattern. The interpreter pattern specifies how to evaluate sentences in a language. The basic idea is to have a class for each symbol (terminal or nonterminal) in a specialized computer language. The syntax tree of a sentence in the language is an instance of the composite pattern and is used to evaluate (interpret) the sentence.[1]
?
Contents[hide] |
[edit] Uses for the Interpreter pattern
- Specialized database query languages such as SQL.
- Specialized computer languages which are often used to describe communication protocols.
- Most general-purpose computer languages actually incorporate several specialized languages.
[edit] Structure
[edit] Example
| The Wikibook Computer Science Design Patterns has a page on the topic of |
The following Reverse Polish notation example illustrates the interpreter pattern. The grammarexpression ::= plus | minus | variable | numberdefines a language which contains reverse polish expressions like:
plus ::= expression expression '+'
minus ::= expression expression '-'
variable ::= 'a' | 'b' | 'c' | ... | 'z'
digit = '0' | '1' | ... '9'
number ::= digit | digit numbera b +Following the interpreter pattern there is a class for each grammar rule.
a b c + -
a b + c a - -
import java.util.HashMap; interface Expression { public int interpret(HashMap<String,Expression> variables); } class Number implements Expression { private int number; public Number(int number) { this.number = number; } public int interpret(HashMap<String,Expression> variables) { return number; } } class Plus implements Expression { Expression leftOperand; Expression rightOperand; public Plus(Expression left, Expression right) { leftOperand = left; rightOperand = right; } public int interpret(HashMap<String,Expression> variables) { return leftOperand.interpret(variables) + rightOperand.interpret(variables); } } class Minus implements Expression { Expression leftOperand; Expression rightOperand; public Minus(Expression left, Expression right) { leftOperand = left; rightOperand = right; } public int interpret(HashMap<String,Expression> variables) { return leftOperand.interpret(variables) - rightOperand.interpret(variables); } } class Variable implements Expression { private String name; public Variable(String name) { this.name = name; } public int interpret(HashMap<String,Expression> variables) { if(null==variables.get(name)) return 0; //Either return new Number(0). return variables.get(name).interpret(variables); } }
While the interpreter pattern does not address parsing[2] a parser is provided for completeness.
import java.util.HashMap; import java.util.Stack; class Evaluator implements Expression { private Expression syntaxTree; public Evaluator(String expression) { Stack<Expression> expressionStack = new Stack<Expression>(); for (String token : expression.split(" ")) { if (token.equals("+")) { Expression subExpression = new Plus(expressionStack.pop(), expressionStack.pop()); expressionStack.push( subExpression ); } else if (token.equals("-")) { // it's necessary remove first the right operand from the stack Expression right = expressionStack.pop(); // ..and after the left one Expression left = expressionStack.pop(); Expression subExpression = new Minus(left, right); expressionStack.push( subExpression ); } else expressionStack.push( new Variable(token) ); } syntaxTree = expressionStack.pop(); } public int interpret(HashMap<String,Expression> context) { return syntaxTree.interpret(context); } }
Finally evaluating the expression "w x z - +" with w = 5, x = 10, and z = 42.
import java.util.HashMap; public class InterpreterExample { public static void main(String[] args) { String expression = "w x z - +"; Evaluator sentence = new Evaluator(expression); HashMap<String,Expression> variables = new HashMap<String,Expression>(); variables.put("w", new Number(5)); variables.put("x", new Number(10)); variables.put("z", new Number(42)); int result = sentence.interpret(variables); System.out.println(result); } }
[edit] See also
[edit] References
- ^ Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. pp. 243 ISBN 0-201-63361-2
- ^ Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. pp. 247 ISBN 0-201-63361-2
[edit] External links
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 44 |
성공적인 HR 프로젝트의 비결: 이해관계자 분석
| 황제낙엽 | 2013.08.23 | 458 |
| 43 | 이해관계자 분석(Conduct Stakeholder Analysis) | 황제낙엽 | 2013.08.23 | 340 |
| 42 |
이해관계자 맵(Stakeholder Map)
| 황제낙엽 | 2013.08.23 | 1698 |
| 41 | Capability Maturity Model Integration | 황제낙엽 | 2013.08.21 | 582 |
| 40 | 애자일 입문 | 황제낙엽 | 2012.11.13 | 192 |
| 39 |
스크럼 관련
| 황제낙엽 | 2012.07.13 | 192 |
| 38 |
GanttProject
| 황제낙엽 | 2011.10.03 | 365 |
| 37 |
DotProject
| 황제낙엽 | 2011.10.03 | 216 |
| 36 | Java Code Coverage Tool (CodeCover) 관련 링크 | 황제낙엽 | 2010.07.30 | 195 |
| 35 |
테스트 계획 (정리 필요, 작성중)
| 황제낙엽 | 2010.04.28 | 184 |
| 34 | TDD 와 Junit | 황제낙엽 | 2007.11.05 | 220 |
| 33 | TDD에관해서 | 황제낙엽 | 2005.10.27 | 176 |
| 32 |
Unit Test Guide Document (유닛 테스트 가이드 문서)
| 황제낙엽 | 2007.11.08 | 205 |
| 31 | AOP가 필요한 이유 | 황제낙엽 | 2008.10.08 | 350 |
| 30 | Core J2EE Patterns: Patterns index page | 황제낙엽 | 2005.11.14 | 222 |
| 29 | 쓴 자바"의 맛 (반 패턴으로 프로그래밍을 향상시키는 방법) | 황제낙엽 | 2007.10.03 | 890 |
| 28 |
해석자 (Interpreter)
| 황제낙엽 | 2008.06.25 | 190 |
| » |
해석자 (Interpreter)
| 황제낙엽 | 2008.06.25 | 983 |
| 26 | 해석자 (Interpreter) | 황제낙엽 | 2008.06.25 | 197 |
| 25 | 해석자 (Interpreter) | 황제낙엽 | 2008.06.25 | 189 |
