行为模式:Interpreter(解释器)
2013-02-07 20:45
405 查看
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 numberdefines 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.Map; interface Expression { public int interpret(Map<String,Expression> variables); } class Number implements Expression { private int number; public Number(int number) { this.number = number; } public int interpret(Map<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(Map<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(Map<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(Map<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.Map; 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(Map<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.Map; import java.util.HashMap; public class InterpreterExample { public static void main(String[] args) { String expression = "w x z - +"; Evaluator sentence = new Evaluator(expression); Map<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); } }
相关文章推荐
- 行为模式之Interpreter(解释器)
- 行为类模式(三):解释器(Interpreter)
- Java设计模式(24)——行为模式之解释器模式(Interpreter)
- 设计模式-行为设计模式:解释器模式 Interpreter
- 【设计模式】行为模式之解释器Interpreter
- 行为设计模式---解释器模式(Interpreter)
- 【设计模式学习笔记十六】【行为模式】【解释器模式(Interpreter)】
- [导入]C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式.zip(9.14 MB)
- 25.解释器模式--Interpreter
- 设计模式--解释器模式(Interpreter)
- php设计模式 Interpreter(解释器模式)
- 解释器模式(Interpreter)
- 设计模式总结之Interpreter Pattern(解释器模式)
- JAVA设计模式—解释器模式(Interpreter)
- 解释器模式(Interpreter)的代码 C++版
- 23设计模式之解释器模式(Interpreter)
- 【设计模式学习笔记十七】【行为模式】【迭代器模式(Interpreter)】
- 面向对象设计模式之Interpreter解释器模式(行为型)
- 设计模式---行为类型---解释器
- 设计模式实现(二十三)--- 解释器模式(interpreter)