解释器模式实例与解析---实例:数学运算解释器
现需要构造一个语言解释器,使得系统可以执行整数间的乘、除和求模运算。如用户输入表达式“3 * 4 / 2 % 4”,输出结果为2。使用解释器模式实现该功能
import java.util.*; public class Calculator { private String statement; private Node node; public void build(String statement) { Node left=null,right=null; Stack stack=new Stack(); String[] statementArr=statement.split(" "); for(int i=0;i<statementArr.length;i++) { if(statementArr[i].equalsIgnoreCase("*")) { left=(Node)stack.pop(); int val=Integer.parseInt(statementArr[++i]); right=new ValueNode(val); stack.push(new MulNode(left,right)); } else if(statementArr[i].equalsIgnoreCase("/")) { left=(Node)stack.pop(); int val=Integer.parseInt(statementArr[++i]); right=new ValueNode(val); stack.push(new DivNode(left,right)); } else if(statementArr[i].equalsIgnoreCase("%")) { left=(Node)stack.pop(); int val=Integer.parseInt(statementArr[++i]); right=new ValueNode(val); stack.push(new ModNode(left,right)); } else { stack.push(new ValueNode(Integer.parseInt(statementArr[i]))); } } this.node=(Node)stack.pop(); } public int compute() { return node.interpret(); } }
public class Client { public static void main(String args[]) { String statement = "3 * 2 * 4 / 6 % 5"; Calculator calculator = new Calculator(); calculator.build(statement); int result = calculator.compute(); System.out.println(statement + " = " + result); } }
public class DivNode extends SymbolNode { public DivNode(Node left,Node right) { super(left,right); } public int interpret() { return super.left.interpret() / super.right.interpret(); } }
public class ModNode extends SymbolNode { public ModNode(Node left,Node right) { super(left,right); } public int interpret() { return super.left.interpret() % super.right.interpret(); } }
public class MulNode extends SymbolNode { public MulNode(Node left,Node right) { super(left,right); } public int interpret() { return super.left.interpret() * super.right.interpret(); } }
public interface Node { public int interpret(); }
public abstract class SymbolNode implements Node { protected Node left; protected Node right; public SymbolNode(Node left,Node right) { this.left=left; this.right=right; } }
public class ValueNode implements Node { private int value; public ValueNode(int value) { this.value=value; } public int interpret() { return this.value; } }
上一篇:
微信小程序ssm电影院售票系统app