定义

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

使用场景

  1. 比如正则表达式,SQL 语句
  2. 编译器、运算表达式
  3. 如果一种特定类型的问题发生的频率足够高,那么就可能值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子的解释器
  4. 可以将一个需要解释执行的语言中的句子表示一个抽象的语法树
  5. 一些重复出现的问题可以用一种简单的语言来进行表达
  6. 一个简单语法需要解释的场景

代码实现

//上下文信息
class Context
{
    private string input;
    public string Input
    {
          get { return intput; }
          set { input = value; } 
    }

    private string output;
    public string Output
    {
          get { return output; }
          set { input = value; }
    }

}

//抽象表达式
abstract class AbstractExpression
{
     public abstract void Interperet(Context context);
}

class TerminalExpression: AbstractExpression
{
     public override void Interpret(Context context)
     {
          Console.WriteLine("终端解释器");
     }
}

class NonterminalExpression: AbstractExpression
{
     public override void Interpret(Context context)
     {
           Console.WriteLine("非终端解释器");
     }
}

void Main()
{
    Context context = new Context();
    IList<AbstractExpression> list = new List<AbstractExpression>();
    list.Add(new TerminalExpression());
    list.Add(new NonterminalExpression());
    list.Add(new TerminalExpression());

    foreach (AbstractExpression exp in list)
    {
         exp.Interpret(context);
    }

}

优点缺点

  1. 可扩展性比较好,灵活
  2. 增加了新的解释表达式的方式
  3. 易于实现简单文法
  4. 解释器模式使用类来表示文法规则,可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写
  5. 可利用的场景比较少
  6. 对于复杂的文法比较难维护,解释器模式会引起膨胀
  7. 解释器模式采用递归调用方法,文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理