内容简介:模型公式,输入一个公式,然后输入其中的参数,然后运算出结果抽象表达式类变量解析器,根据此,可以获得保存在map中的键值对
四则运算
模型公式,输入一个公式,然后输入其中的参数,然后运算出结果
代码如下
抽象表达式类
public abstract class Expression{ // 解析数值,key是参数,value是数字 public abstract int interpreter(HashMap<String, Integer> var); }
变量解析器,根据此,可以获得保存在map中的键值对
public class VarExpress extends Expression{ private String key; public VarExpression(String _key){ this.key = _key; } // map取 public int interpreter(HashMap<String, Integer> var){ return var.get(this.key); } }
抽象运算符号解析器
public abstract class SymbolExpression extends Expression{ // 左数值 protected Expression left; // 右数值 protected Expression right; // 初始化 public SymbolExpression(Expression _left, Expression _right){ this.left = _left; this.right = _right; } }
对加法进行解析
public class AddExpression extends SymbolExpression{ public AddExpression(Expression _left, Expression _right){ super(_left, _right); } // 进行相加 public int interpreter(HashMap<String, Integer> var){ // 取得,两边的变量都保存在HashMap表中,根据left和right变量,进行相加 return super.left.interpreter(var) + super.right.interpreter(var); } // 进行相减 public int interpreter(HashMap<String,Integer> var){ return super.left.interpreter(var) - super.right.interpreter(var); } }
再次对解析器进行封装,此为公式
public class Calculator{ // 定义表达式 private Expression expression; // 传参 public Calculator(String expStr){ // 用于先后顺序 Stack stack = new Stack(); // 将表达式拆分 char[] charArray = expStr.toCharArray(); // 运算 Expression left = null; Expression right = null; for(int i = 0; i < charArray.length; i++){ switch(charArray[i]){ case '+' // 出栈 left = stack.pop(); right = new VarExpression(String.valueOf(chrArray[++i])); // 将结果入栈 stack.push(new AddExpression(left, right)); break; case '-' // 放入栈中 left = stack.pop(); right = new VarExpression(String.valueOf(charArray[++i])); stack.push(new SubExpression(left,right)); break; default: stack.push(new VarExpression(String.value(charArray[i]))); } } // 运算结果抛出 this.expression = stack.pop(); } // 运算 public int run(HashMap<String, Integer> var){ return this.expression.interpreter(var); } }
在上方中,完成的是对表达式的输入
最后场景
public class Client{ public static void main(String[] args) throws IOException{ String expStr = getExpStr(); // 赋值 HashMap<String, Integer> var = getValue(expStr); Calculator cal = new Calculator(expStr); System.out.println("运算"); } // 获得表达式 public static String getExpStr() throws IOException{ // 新建一个缓冲区,从缓冲区中读取数据 return (new BufferedReader(new InputStreamReader(System.in))).readLine(); } // 获得值映射 public static HashMap<String, Integer> getValue(String expStr) throws IOException{ HashMap<String, Integer> map = new HashMap<String, Integer>(); // 解析 for(char ch:exprStr.toCharArray()){ if(ch != '+' && != '-'){ if(!map.containsKey(String.valueOf(ch))){ // 从缓冲区中,读取整行 String in = (new BufferReader(new InputStreamReader(System.in))).readLine(); } } } return map; } }
总结
解释器模式不难,核心思想在于构建语法树,进行运算的时候,进行递归调用。
具体做法是创建几个解释器,在创建一个解释器封装类,在解释器封装类中完成语法树的构建。然后在场景类中完成递归调用。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式(二十四)解释器模式
- 设计模式 | 解释器模式及典型应用
- 折腾Java设计模式之解释器模式
- Java中的解释器interpreter设计模式 - JournalDev
- 用 Haskell 实现解释器
- 怎样写一个解释器(雾)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。