解释器模式

给定一种语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器

 


1)      抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语法树中的节点)都要实现的。

2)      终结符表达式角色:具体表达式。

3)      非终结符表达式角色:具体表达式。

4)      上下文(环境)角色:包含解释器之外的一些全局信息。

 

//上下文(环境)角色,使用HashMap来存储变量对应的数值

class Context
{
 private Map valueMap = new HashMap();
 public void addValue(Variable x , int y)
 {
  Integer yi = new Integer(y);
  valueMap.put(x , yi); 

}

 public int LookupValue(Variable x)
 {
  int i = ((Integer)valueMap.get(x)).intValue();
  return i ;
 }
}

//
抽象表达式角色,也可以用接口来实现

abstract class Expression
{
 public abstract int interpret(Context con);
}

//
终结符表达式角色

class Constant extends Expression
{
 private int i ;
 public Constant(int i)
 {
  this.i = i;
 }

 public int interpret(Context con)
 {
  return i ;
 }
}

class Variable extends Expression
{
 public int interpret(Context con)
 {
  //this为调用interpret方法的Variable对象
  return con.LookupValue(this);
 }
}

//
非终结符表达式角色

class Add extends Expression
{
 private Expression left ,right ;
 public Add(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  return left.interpret(con) + right.interpret(con);
 }
}

class Subtract extends Expression
{
 private Expression left , right ;
 public Subtract(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  return left.interpret(con) - right.interpret(con);
 }

}

class Multiply extends Expression
{
 private Expression left , right ;
 public Multiply(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }
 public int interpret(Context con)
 {
  return left.interpret(con) * right.interpret(con);
 }
}

class Division extends Expression
{
 private Expression left , right ;
 public Division(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  try{
   return left.interpret(con) / right.interpret(con);
  }catch(ArithmeticException ae)
  {
   System.out.println("被除数为0");
   return -11111;
  }
 }
}

//
测试程序,计算 (a*b)/(a-b+2)

public class Test
{
 private static Expression ex ;
 private static Context con ;
 public static void main(String[] args)
 {
  con = new Context();
  //设置变量、常量
  Variable a = new Variable();
  Variable b = new Variable();
  Constant c = new Constant(2);
  //为变量赋值
  con.addValue(a , 5);
  con.addValue(b , 7);
  //运算,对句子的结构由我们自己来分析,构造
  ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c));
  System.out.println("运算结果为:"+ex.interpret(con));
 }
}

原文地址:https://www.cnblogs.com/jinzhengquan/p/1935895.html