一.什麼是解釋器模式
給定一個語言,定義文法表示,並定義一個解釋器去解釋定義的句子。
二.解釋器模式的寫法
解釋器模式,主要有抽象的解釋器,終結表達式,非終結表達式和上下文。如果按輸入字符串得到結果的計算器來理解,抽象的解釋器定義任務也就是得到的結果,終結表達式表達的是字符對應的數字的解釋操作,一般只有一個,而非終結的表達式有點像各種各樣的符號計算順便返回結果。上下文環境則是定義包含解釋操作的其他環境。
這次我們看看代碼,我們先定義一個抽象的解釋器,持有上下文引用。
public abstract class AbstractExpression {
protected abstract double interprete(Context context);
}
再來定義一組非終結表達式
/**
* 非終結表達式
* @author Seven
*
*/
public abstract class NonTerminalExpression extends AbstractExpression{
protected AbstractExpression expression1,expression2;
public NonTerminalExpression(AbstractExpression expression1, AbstractExpression expression2) {
super();
this.expression1 = expression1;
this.expression2 = expression2;
}
}
/**
* 加法表達式
* @author Seven
*
*/
public class PlusExpression extends NonTerminalExpression{
public PlusExpression(AbstractExpression expression1, AbstractExpression expression2) {
super(expression1, expression2);
}
@Override
protected double interprete(Context context) {
return expression1.interprete(context)+expression2.interprete(context);
}
}
/**
* 減法表達式
* @author Seven
*
*/
public class MinusExpression extends NonTerminalExpression{
public MinusExpression(AbstractExpression expression1, AbstractExpression expression2) {
super(expression1, expression2);
}
@Override
protected double interprete(Context context) {
return expression1.interprete(context)-expression2.interprete(context);
}
}
我們再來定義一個終結表達式
/** 終結表達式
* @author Seven
*
*/
public class TerminalExpression extends AbstractExpression{
String var;
public TerminalExpression(String var) {
super();
this.var = var;
}
@Override
protected double interprete(Context context) {
return context.lookup(this);
}
}
我們再來看看客戶端測試
public class Client {
public static void main(String[] args) {
Context context = new Context();
TerminalExpression a = new TerminalExpression("a");
TerminalExpression b = new TerminalExpression("b");
TerminalExpression c = new TerminalExpression("c");
context.add(a, 4.0);
context.add(b, 8.0);
context.add(c, 2.0);
// 以上定義將終結表達式所表示的內容一一對應起來,並放到上下文環境中。可以理解爲也就是定義文法,解釋器的規則。
AbstractExpression abstractExpression = new MinusExpression(b, c);
System.out.println(abstractExpression.interprete(context)); //得到結果6
AbstractExpression abstractExpression1 = new PlusExpression(b, c);
System.out.println(abstractExpression1.interprete(context));//得到結果10
AbstractExpression abstractExpression2 = new PlusExpression(abstractExpression, c);
System.out.println(abstractExpression2.interprete(context));//先執行abstractExpression的interprete得到結果6,在減去c的interpreter得到的值 然後得到結果8
// System.out.println(new MinusExpression(new PlusExpression(a,b), c).interprete(context));
}
}
三.小結
以上就是一個解釋器模式的代碼寫法,解釋器模式是爲了解決一些文法的表達和轉換,採用的是一種遞歸調用,所以看上去不是很好理解,看下最後一個的測試代碼。當我們有一些簡單的文法表達式可使用解釋器模式。