디자인패턴 해석자 (Interpreter)

황제낙엽 2008.06.25 23:28 조회 수 : 943 추천: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

번호 제목 글쓴이 날짜 조회 수
64 StarUML™의 숨은 재미있는 기능 황제낙엽 2017.03.29 2288
63 이해관계자 맵(Stakeholder Map) file 황제낙엽 2013.08.23 1647
62 PMBOK 5판 이해관계자 관리의 이해 [1] file 황제낙엽 2013.08.23 1436
» 해석자 (Interpreter) file 황제낙엽 2008.06.25 943
60 쓴 자바"의 맛 (반 패턴으로 프로그래밍을 향상시키는 방법) 황제낙엽 2007.10.03 857
59 뒤늦게 정리하는 UML (Unified Modeling Language) 요약 file 황제낙엽 2017.03.29 566
58 Capability Maturity Model Integration 황제낙엽 2013.08.21 536
57 이해관계자의 관리/이해관계자 분석 황제낙엽 2013.08.23 494
56 StarUML + Manual file 황제낙엽 2013.02.07 483
55 비 개발자 출신이 스크럼 마스터가 될 수 있는가? 황제낙엽 2015.06.25 456
54 The Facade Pattern file 황제낙엽 2017.01.04 440
53 성공적인 HR 프로젝트의 비결: 이해관계자 분석 file 황제낙엽 2013.08.23 424
52 와블스 프로세스(Warbles Process) 황제낙엽 2016.07.17 356
51 GanttProject file 황제낙엽 2011.10.03 333
50 Factory Method(팩토리 메소드) 패턴 file 황제낙엽 2007.11.25 320
49 Builder(빌더) 패턴 황제낙엽 2007.11.25 315
48 AOP가 필요한 이유 황제낙엽 2008.10.08 313
47 이해관계자 분석(Conduct Stakeholder Analysis) 황제낙엽 2013.08.23 300
46 디자인패턴[Observer 패턴] 황제낙엽 2013.10.18 287
45 [Selenium] MS Edge 실행 자동화(RPA, Robotic Process Automation) file 황제낙엽 2024.05.02 278