行为型设计模式——解释器模式

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语句中的句子。

适用于

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     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code

 

posted @ 2025-05-09 18:31  是铭不是明  阅读(9)  评论(0)    收藏  举报