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 | number
defines 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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
43 | 이해관계자 분석(Conduct Stakeholder Analysis) | 황제낙엽 | 2013.08.23 | 291 |
42 |
이해관계자 맵(Stakeholder Map)
![]() | 황제낙엽 | 2013.08.23 | 1640 |
41 | Capability Maturity Model Integration | 황제낙엽 | 2013.08.21 | 531 |
40 | 애자일 입문 | 황제낙엽 | 2012.11.13 | 152 |
39 |
스크럼 관련
![]() | 황제낙엽 | 2012.07.13 | 153 |
38 |
GanttProject
![]() | 황제낙엽 | 2011.10.03 | 326 |
37 |
DotProject
![]() | 황제낙엽 | 2011.10.03 | 152 |
36 | Java Code Coverage Tool (CodeCover) 관련 링크 | 황제낙엽 | 2010.07.30 | 149 |
35 |
테스트 계획 (정리 필요, 작성중)
![]() | 황제낙엽 | 2010.04.28 | 129 |
34 | TDD 와 Junit | 황제낙엽 | 2007.11.05 | 180 |
33 | TDD에관해서 | 황제낙엽 | 2005.10.27 | 130 |
32 |
Unit Test Guide Document (유닛 테스트 가이드 문서)
![]() | 황제낙엽 | 2007.11.08 | 156 |
31 | AOP가 필요한 이유 | 황제낙엽 | 2008.10.08 | 304 |
30 | Core J2EE Patterns: Patterns index page | 황제낙엽 | 2005.11.14 | 175 |
29 | 쓴 자바"의 맛 (반 패턴으로 프로그래밍을 향상시키는 방법) | 황제낙엽 | 2007.10.03 | 847 |
28 |
해석자 (Interpreter)
![]() | 황제낙엽 | 2008.06.25 | 149 |
» |
해석자 (Interpreter)
![]() | 황제낙엽 | 2008.06.25 | 938 |
26 | 해석자 (Interpreter) | 황제낙엽 | 2008.06.25 | 160 |
25 | 해석자 (Interpreter) | 황제낙엽 | 2008.06.25 | 151 |
24 | EJB3의 Entity Access Object 패턴 | 황제낙엽 | 2008.04.10 | 149 |