解释器Interpreter
- - 企业架构 - ITeye博客所谓解释器模式就是定义一个语言的文法,并建立一个解释器来解释该语言中的句子. 比如:taglib标签,正则表达式都是采用的解释器. 解释器不仅仅只定义一种语法语义,更可以使用一个抽象语法树定义一个语言实例. AbstractExpression: 抽象表达式. 声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享.
所谓解释器模式就是定义一个语言的文法,并建立一个解释器来解释该语言中的句子!
比如:taglib标签,正则表达式都是采用的解释器。
解释器不仅仅只定义一种语法语义,更可以使用一个抽象语法树定义一个语言实例。
解释器角色:
AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
Context: 环境类。包含解释器之外的一些全局信息。
Client: 客户类。 抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。
下面用解释器处理上面的例子: 5*6/3%4
//抽象表达式 public interface Node{ public int interpret(); } //非终结表达式实现 public class ValueNode implements Node{ private int value; public ValueNode(int value){ this.value=value; } public int interpret(){ return this.value; } }
//抽象终结表达式 public abstract class SymbolNode implements Node{ public Node left; public Node right; public SymbolNode(Node left,Node right){ this.left=left; this.right=right; } }
//乘法 public class MulNode extends SymbolNode{ public MulNode(Node left,Node right){ super(left,right); } public int interpret(){ return left*right; } } //除法 public class DevNode extends SymbolNode{ public DevNode(Node left,Node right){ super(left,right); } public int interpret(){ return left/right; } } //取模 public class MolNode extends SymbolNode{ public MolNode(Node left,Node right){ super(left,right); } public int interpret(){ return left%right; } }
public class Calculator{ public int result; public Calculator(String expStr) { // 定义一个堆栈,安排运算的先后顺序 Stack<Node> stack = new Stack<Node>(); // 表达式拆分为字符数组 char[] charArray = expStr.toCharArray(); // 运算 Node left = null; Node right = null; for (int i = 0; i < charArray.length; i++) { switch (charArray[i]) { case '*': // // 结果放到堆栈中 left = stack.pop(); right =new ValueNode( Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new MulNode(left, right)); break; case '/': left = stack.pop(); right = new ValueNode( Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new DevNode(left, right)); break; case '%': left = stack.pop(); right = new ValueNode(Integer.parseInt(String.valueOf(charArray[++i]))); stack.push(new MolNode(left, right)); break; default: // 公式中的变量 stack.push(new ValueNode(Integer.parseInt(String.valueOf(charArray[++i])))); } this.result=stack.pop(); } public int getResult(){ return this.result; } }
//客户端 main(){ String express="5*6/3%4"; Calculator c=new Calculator (express); System.out.print(c.getResult()); }
解释器模式扩展性强,能处理表达式中重复出现的问题,但是应用场景少。