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)); } } 解釋器模式并沒有說明如何創建一個抽象語法樹,因此它的實現可以多種多樣,在上面我們是直接在Test中提供的,當然還有更好、更專業的實現方式。