디자인패턴 해석자 (Interpreter)

황제낙엽 2008.06.25 23:28 조회 수 : 551 추천:93

sitelink1  
sitelink2  
sitelink3 http://1 
extra_vars4 ko 
extra_vars5  
extra_vars6 sitelink1 

Interpreter pattern

From Wikipedia, the free encyclopedia
Jump to: navigation, search

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

Interpreter_UML_class_diagram.jpg

[edit] Example


The following Reverse Polish notation example illustrates the interpreter pattern. The grammar
expression ::= plus | minus | variable | number
plus ::= expression expression '+'
minus ::= expression expression '-'
variable  ::= 'a' | 'b' | 'c' | ... | 'z'
digit = '0' | '1' | ... '9'
number ::= digit | digit number

defines a language which contains reverse polish expressions like:
a b +
a b c + -
a b + c a - -

Following the interpreter pattern there is a class for each grammar rule.

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

  1. ^ 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
  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

번호 제목 글쓴이 날짜 조회 수
63 이해관계자 맵(Stakeholder Map) file 황제낙엽 2013.08.23 1513
62 PMBOK 5판 이해관계자 관리의 이해 [1] file 황제낙엽 2013.08.23 1291
61 쓴 자바"의 맛 (반 패턴으로 프로그래밍을 향상시키는 방법) 황제낙엽 2007.10.03 728
» 해석자 (Interpreter) file 황제낙엽 2008.06.25 551
59 뒤늦게 정리하는 UML (Unified Modeling Language) 요약 file 황제낙엽 2017.03.29 458
58 Capability Maturity Model Integration 황제낙엽 2013.08.21 419
57 이해관계자의 관리/이해관계자 분석 황제낙엽 2013.08.23 392
56 StarUML + Manual file 황제낙엽 2013.02.07 362
55 비 개발자 출신이 스크럼 마스터가 될 수 있는가? 황제낙엽 2015.06.25 356
54 StarUML™의 숨은 재미있는 기능 황제낙엽 2017.03.29 356
53 The Facade Pattern file 황제낙엽 2017.01.04 312
52 성공적인 HR 프로젝트의 비결: 이해관계자 분석 file 황제낙엽 2013.08.23 302
51 와블스 프로세스(Warbles Process) 황제낙엽 2016.07.17 237
50 Builder(빌더) 패턴 황제낙엽 2007.11.25 195
49 AOP가 필요한 이유 황제낙엽 2008.10.08 187
48 이해관계자 분석(Conduct Stakeholder Analysis) 황제낙엽 2013.08.23 178
47 Factory Method(팩토리 메소드) 패턴 file 황제낙엽 2007.11.25 178
46 StarUML 에서 사용하는 용어 정리 황제낙엽 2010.07.30 162
45 디자인패턴[Observer 패턴] 황제낙엽 2013.10.18 156
44 패턴 입문가에게 권하는 책 - Head First Design Patterns (스토리가 있는 패턴 학습법) 황제낙엽 2007.11.25 118