文章出處
文章列表
使用頻率:★☆☆☆☆
一、什么是解釋器模式
定義一些語法規則,然后定義一個解析器去解析該語法;
二、補充說明
該模式極少使用,簡單了解下吧~
三、角色(以加減法解析為例)
抽象表達式類
末端表達式類:數字變量
非末端表達式:+-操作
環境角色:存一些變量。。。
客戶端
四、例子,JAVA實現
參考維基百科例子
一個解析加減法語法規則的例子
抽象表達式類、以及末端表達式類和非末端表達式類
package com.pichen.dp.behavioralpattern.interpreter; import java.util.Map; public 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); } }
package com.pichen.dp.behavioralpattern.interpreter; import java.util.Map; import java.util.Stack; public 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); } }
客戶端角色,包含環境角色,直接寫在main函數里面了
package com.pichen.dp.behavioralpattern.interpreter; 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); } }
結果打印:-27
文章列表
全站熱搜