定义
给定一门语言,定义它的文法的一种表示,并定义一种解释器,该解释器使用该表示来解释语言中的句子。
解释器模式的角色
1:抽象表达式角色(AbstractExpression)
该角色声明一个所有的具体表达式都需要实现的抽象接口,该接口主要是宇哥解释器操作interpret()方法。
public abstract class AbstractExpression{
public abstract Object interpret(Context ctx);
}
2:终结符表达式(TerminalExpression)
该角色实现了抽象表达式中所要求的接口,文法中的每一个终结符都有具体终结表达式与之对应。
public class TerminalExpression extends AbstractExpression{
@Override
public Object interpret(Context ctx){
return null;
}
}
3:非终结表达式(NotterminalExpression)
该角色是一个具体角色,文法中的每一条规则都对应一个非终结符表达式类。
public class NotterminalExpression extends AbstractExpression{
//每个非终结表达式都会对其他表达式产生依赖。
public NotterminalExpression(AbstractExpression expression){
//TO_DO
}
@Overrdie
public Object interpret(Context ctx){
return null;
}
}
4:环境角色(Context)
该角色提供解释器之外的一些全局信息。
public class Context{
private HashMap map = new HashMap();
//TO_DO
}
5:客户端角色(Client)
该角色创建一个抽象语法树,调用解释操作。
public class Client{
public static void main(String [] args){
Context ctx = new Context();
for(;;){
//自旋,进行语法判断,并产生递归调用
}
}
}
优点
1:简单的语法分析工具。
2:扩展性良好,修改语法规则只需要修改响应得费终结表达式即可。
缺点
1:解释器模式会引起类膨胀。每个语法都要产生一个非终结表达式,语法比较复杂的时候可能会产生大量的类文件,不易于维护。
2:采用递归方法调用,不易调试,影响效率。
使用场景
重复发生的问题可以使用解释器模式。
解释器模式是一个非常少用的模式
参考资料:设计模式(java)