一、意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
当有一个语言需要解释执行,并且你可将语言中的句子表示为一个抽象的语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
- 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是最好的选择。他们无需构建抽象语法树,即可解释表达式,这样可以节省空间而且还可能节省时间。
- 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的。
三、结构
四、代码
public abstract class ArithmeticExpression {
/**
* 抽象的解析方法
* 具体的解析逻辑由具体的子类实现
*
* @return 解析到具体的值
*/
public abstract int interpret();
}
public class NumExpression extends ArithmeticExpression {
private int num;
public NumExpression(int num){
this.num = num;
}
@Override
public int interpret() {
return num;
}
}
public abstract class OperatorExpression extends ArithmeticExpression {
protected ArithmeticExpression exp1,exp2;
public OperatorExpression(ArithmeticExpression exp1,ArithmeticExpression exp2){
this.exp1 = exp1;
this.exp2 = exp2;
}
}
public class AdditionExpression extends OperatorExpression {
public AdditionExpression(ArithmeticExpression exp1, ArithmeticExpression exp2) {
super(exp1, exp2);
}
@Override
public int interpret() {
return exp1.interpret() + exp2.interpret();
}
}
public class Client {
public static void main(String[] args) {
Calculator c = new Calculator("10 + 5 + 10 + 7");
System.out.println(c.calculate());
}
}
运行结果:
32