定义:
是一种按照规定语法对表达式进行解析的方案
给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子
角色:
- 抽象表达式:定义有参数的interpret()方法
- 终结符表达式:取值
- 非终结符表达式:+-*/
- 环境:存值
- 客户端
优点:
- 简单的语法分析工具
- 扩展性,修改语法只需要修改相应的非终结符表达式即可,若扩展语法只需要增加非终结符类即可
缺点:
- 会引起类膨胀
- 采用递归调用算法
场景:
- 重复发生的问题可以使用解释器模式
- 一个简单语法需要解释的场景
实例:算术运算
注意interpret(Variable var)方法有参数 原因是一定要带着Variable对象,否则就会读取数字失败,报null。
package 解释器模型;
public interface Arithmetic {
public int interpret(Variables var);
}
package 解释器模型;
import java.util.HashMap;
import java.util.Map;
public class Variables { //存数字
private Map<Value, Integer> map = new HashMap<Value, Integer>();
public void add(Value v, int x) {
map.put(v, x);
}
public int get(Value v) {
return map.get(v);
}
}
package 解释器模型;
public class Value implements Arithmetic{
@Override
public int interpret(Variables var) {
// TODO 自动生成的方法存根
return var.get(this);
}
}
package 解释器模型;
public class Plus implements Arithmetic{
private Arithmetic left;
private Arithmetic right;
private int sum;
public Plus(Arithmetic left,Arithmetic right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Variables var) {
// TODO 自动生成的方法存根
return left.interpret(var)+right.interpret(var);
}
}
package 解释器模型;
public class Sub implements Arithmetic{
private Arithmetic left;
private Arithmetic right;
private int sum;
public Sub(Arithmetic left,Arithmetic right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Variables var) {
// TODO 自动生成的方法存根
return left.interpret(var)-right.interpret(var);
}
}
package 解释器模型;
public class Mul implements Arithmetic{
private Arithmetic left;
private Arithmetic right;
private int sum;
public Mul(Arithmetic left,Arithmetic right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Variables var) {
// TODO 自动生成的方法存根
return left.interpret(var)*right.interpret(var);
}
}
package 解释器模型;
public class Div implements Arithmetic{
private Arithmetic left;
private Arithmetic right;
private int sum;
public Div(Arithmetic left,Arithmetic right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Variables var) {
// TODO 自动生成的方法存根
return left.interpret(var)/right.interpret(var);
}
}
package 解释器模型;
public class Main {
public static void main(String []args) {
Variables variables = new Variables();
Value x = new Value();
Value y = new Value();
Value z = new Value();
variables.add(x, 10);
variables.add(y, 20);
variables.add(z, 30);
// 计算x*(y+z/x)-x
int v = new Sub(new Mul(x, new Plus(y, new Div(z, x))), x).interpret(variables);
System.out.println("x*(y+z/x)-x="+v);
}
}
x*(y+z/x)-x=220