给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的 句子。
解释器模式包含以下主要角色
下面是一个简单的解释器模式的C#实现,这个例子中,我们将创建一个IExpression接口和实现了IExpression接口的具体类AddExpression和SubtractExpression。Context是一个解释器上下文类,它将用于存储和管理解释器的状态。
🐤抽象角色AbstractExpression
- public interface AbstractExpression
- {
- public int interpret(Context context);
-
- public string toString();
- }
🐤终结符表达式角色
- public class Value : AbstractExpression
- {
- private int _value;
-
- public Value(int value)
- {
- _value = value;
- }
-
- public int interpret(Context context)
- {
- return _value;
- }
-
- public string toString()
- {
- return _value.ToString();
- }
- }
🐤非终结符表达式角色 加减法表达式
- ///
- /// 加法
- ///
- public class Plus : AbstractExpression
- {
- private AbstractExpression _left;
- private AbstractExpression _right;
-
- public Plus(AbstractExpression left, AbstractExpression right)
- {
- _left = left;
- _right = right;
- }
-
- public int interpret(Context context)
- {
- return _left.interpret(context) + _right.interpret(context);
- }
-
- public String toString()
- {
- return "(" + _left.toString() + " + " + _right.toString() + ")";
- }
- }
-
- ///
- /// 减法
- ///
- public class Minus : AbstractExpression
- {
- private AbstractExpression _left;
- private AbstractExpression _right;
-
-
- public Minus(AbstractExpression left, AbstractExpression right)
- {
- _left = left;
- _right = right;
- }
-
- public int interpret(Context context)
- {
- return _left.interpret(context) - _right.interpret(context);
- }
-
- public string toString()
- {
- return "(" + _left.toString() + " - " + _right.toString() + ")";
- }
- }
🐤终结符表达式角色 变量表达式
- public class Variable:AbstractExpression
-
- {
- private string _name;
-
- public Variable(string name)
- {
- _name = name;
- }
-
- public int interpret(Context context)
- {
- return context.GetValue(this);
- }
-
- public string toString()
- {
- return _name;
- }
- }
🐤环境(Context)角色
- public class Context
- {
- private Dictionary
int> map = new Dictionaryint>(); -
- public void Assign(Variable var, int value)
- {
- map[var] = value;
- }
-
- public int GetValue(Variable var)
- {
- int value = map[var];
- return value;
- }
- }
🐳测试类
- class MyClass
- {
- public static void Main(string[] args)
- {
- Context context = new Context();
- Variable a = new Variable("a");
- Variable b = new Variable("b");
- Variable c = new Variable("c");
- Variable d = new Variable("d");
- Variable e = new Variable("e");
-
- context.Assign(a, 1);
- context.Assign(b, 2);
- context.Assign(c, 3);
- context.Assign(d, 4);
- context.Assign(e, 5);
- AbstractExpression expression = new Minus(new Plus(new Plus(new
- Plus(a, b), c), d), e);
- Console.WriteLine(expression + "= " +
- expression.interpret(context));
- }
- }
👻运行结果!

优点:
缺点:
使用场景: