定義
給定一門語言,定義它的文法的一種表示,并定義一種解釋器,該解釋器使用該表示來解釋語言中的句子。
解釋器模式的角色
1:抽象表達式角色(AbstractExpression)
該角色聲明一個所有的具體表達式都需要實現(xiàn)的抽象接口,該接口主要是宇哥解釋器操作interpret()方法。
public abstract class AbstractExpression{
public abstract Object interpret(Context ctx);
}
2:終結符表達式(TerminalExpression)
該角色實現(xiàn)了抽象表達式中所要求的接口,文法中的每一個終結符都有具體終結表達式與之對應。
public class TerminalExpression extends AbstractExpression{
@Override
public Object interpret(Context ctx){
return null;
}
}
3:非終結表達式(NotterminalExpression)
該角色是一個具體角色,文法中的每一條規(guī)則都對應一個非終結符表達式類。
public class NotterminalExpression extends AbstractExpression{
//每個非終結表達式都會對其他表達式產(chǎn)生依賴。
public NotterminalExpression(AbstractExpression expression){
//TO_DO
}
@Overrdie
public Object interpret(Context ctx){
return null;
}
}
4:環(huán)境角色(Context)
該角色提供解釋器之外的一些全局信息。
public class Context{
private HashMap map = new HashMap();
//TO_DO
}
5:客戶端角色(Client)
該角色創(chuàng)建一個抽象語法樹,調用解釋操作。
public class Client{
public static void main(String [] args){
Context ctx = new Context();
for(;;){
//自旋,進行語法判斷,并產(chǎn)生遞歸調用
}
}
}
優(yōu)點
1:簡單的語法分析工具。
2:擴展性良好,修改語法規(guī)則只需要修改響應得費終結表達式即可。
缺點
1:解釋器模式會引起類膨脹。每個語法都要產(chǎn)生一個非終結表達式,語法比較復雜的時候可能會產(chǎn)生大量的類文件,不易于維護。
2:采用遞歸方法調用,不易調試,影響效率。
使用場景
重復發(fā)生的問題可以使用解釋器模式。
解釋器模式是一個非常少用的模式
參考資料:設計模式(java)