定义
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
使用场景
- 比如正则表达式,SQL 语句
- 编译器、运算表达式
- 如果一种特定类型的问题发生的频率足够高,那么就可能值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子的解释器
- 可以将一个需要解释执行的语言中的句子表示一个抽象的语法树
- 一些重复出现的问题可以用一种简单的语言来进行表达
- 一个简单语法需要解释的场景
代码实现
//上下文信息
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);
}
}优点缺点
- 可扩展性比较好,灵活
- 增加了新的解释表达式的方式
- 易于实现简单文法
- 解释器模式使用类来表示文法规则,可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写
- 可利用的场景比较少
- 对于复杂的文法比较难维护,解释器模式会引起膨胀
- 解释器模式采用递归调用方法,文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理