行为型设计模式——解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。
适用于
Interpreter模式适用于当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时,以下情况效果最好:
①该文法简单。对于复杂的发文,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无须构建抽象语法树即可解释表达式,这样可以节省空间还可能节省时间。
②效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。不过,即使在这种情况下,转换器仍然可用该模式实现。
类图如下

1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 //创建环境对象 6 Context context = new Context(); 7 8 //创建多个变量对象 9 VariableExpression a = new VariableExpression("a"); 10 VariableExpression b = new VariableExpression("b"); 11 VariableExpression c = new VariableExpression("c"); 12 VariableExpression d = new VariableExpression("d"); 13 14 //将变量存储到环境对象中 15 context.Assign(a, 1); 16 context.Assign(b, 2); 17 context.Assign(c, 3); 18 context.Assign(d, 4); 19 20 //获取抽象语法树 21 AbstractExpression expression = new AddExpresssion(new MunusExpresssion(c, new AddExpresssion(a, b)), d); 22 23 int result = expression.Interprete(context); 24 25 Console.WriteLine(expression.ToString() + "=" + result); 26 } 27 }
1 /// <summary> 2 /// 抽象表达式类,声明一个解释操作 3 /// </summary> 4 internal abstract class AbstractExpression 5 { 6 //返回值为int类型的解释器方法 7 public abstract int Interprete(Context context); 8 }
1 /// <summary> 2 /// 环境角色类 3 /// </summary> 4 internal class Context 5 { 6 //定义一个键值对,用来存储变量以及对应的值 7 private Dictionary<VariableExpression, int> variables = new Dictionary<VariableExpression, int>(); 8 9 //添加变量的功能 10 public void Assign(VariableExpression variable, int value) 11 { 12 variables.Add(variable, value); 13 } 14 15 //根据变量获取对应的值 16 public int GetValue(VariableExpression variable) 17 { 18 return variables[variable]; 19 } 20 }
1 /// <summary> 2 /// 终结符表达式类,封装数值 3 /// </summary> 4 internal class VariableExpression : AbstractExpression 5 { 6 //数据名称 7 private string name; 8 public VariableExpression(string name) 9 { 10 this.name = name; 11 } 12 public override int Interprete(Context context) 13 { 14 //返回变量值 15 return context.GetValue(this); 16 } 17 18 public override string ToString() 19 { 20 return name; 21 } 22 }
1 /// <summary> 2 /// 非终结表达式类,封装加法 3 /// </summary> 4 internal class AddExpresssion : AbstractExpression 5 { 6 private AbstractExpression left; 7 private AbstractExpression right; 8 public AddExpresssion(AbstractExpression left, AbstractExpression right) 9 { 10 this.left = left; 11 this.right = right; 12 } 13 public override int Interprete(Context context) 14 { 15 //将左边表达式的结果与右边表达式的结果相加 16 return left.Interprete(context) + right.Interprete(context); 17 } 18 19 public override string ToString() 20 { 21 return $"({left.ToString()}+{right.ToString()})"; 22 } 23 }
1 /// <summary> 2 /// 非终结表达式类,封装减法 3 /// </summary> 4 internal class MunusExpresssion : AbstractExpression 5 { 6 private AbstractExpression left; 7 private AbstractExpression right; 8 public MunusExpresssion(AbstractExpression left, AbstractExpression right) 9 { 10 this.left = left; 11 this.right = right; 12 } 13 public override int Interprete(Context context) 14 { 15 //将左边表达式的结果与右边表达式的结果相减 16 return left.Interprete(context) - right.Interprete(context); 17 } 18 19 public override string ToString() 20 { 21 return $"({left.ToString()}-{right.ToString()})"; 22 } 23 }

浙公网安备 33010602011771号