使用频率:★☆☆☆☆
一、什么是解释器模式
定义一些语法规则,然后定义一个解析器去解析该语法;
所谓解释器模式就是定义语言的文法,并且建立一个解释器来解释该语言中的句子。
在这里我们将语言理解成使用规定格式和语法的代码。
在前面我们知道可以构建解释器来解决那些频繁发生的某一特定类型的问题,在这我们将这些问题的实例表述为一个语言中句子。例如我经常利用正则表达式来检测某些字符串是否符合我们规定的格式。这里正则表达式就是解释器模式的应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。
解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
二、补充说明
该模式极少使用,简单了解下吧~
三、角色(以加减法解析为例)
抽象表达式类
末端表达式类:数字变量
非末端表达式:+-操作
环境角色:存一些变量。。。
客户端
四、例子,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 stackExpression right = expressionStack.pop();// ..and after the left oneExpression left = expressionStack.pop();Expression subExpression = new Minus(left, right);expressionStack.push(subExpression);} elseexpressionStack.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 - +"; //这个逆波兰表达式解释后就是 (x-z)+wEvaluator 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
@Author 风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/
@Copyright 转载请注明出处,谢谢~