【解释器模式】
解释器模式(interpreter)给定一个语言,定义他的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
【介绍】
-
主要解决:对于一些固定文法构造一个解释句子的解释器
-
如何解决:构件语法树,定义终结符和非终结符
-
关键代码:构建环境类,包含解释器之外的一些全部信息,一般是HashMap
-
优点:可拓展性好;增加了新的解释表达式的方式;易于实现简单文法
-
缺点:可利用场景比较少;对于复杂的文法比较难以维护;解释器模式会引起类膨胀;解释器模式采用递归调用方法
-
注意事项:可利用场景比较少
【实现】
步骤一:AbstractExpression类:抽象表达式类
abstract class AbstractExpression
{
public abstract void Interpret(Context context);
}
步骤二:TerminalExpression类:终结符表达式
class TerminalExpression:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("终端解释器");
}
}
步骤三:NoterminalExpression类:非终结符表达式
class NoterminalExpression:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("非终端解释器");
}
}
步骤四:context类:包含解释器之外的全局信息
class Context
{
private string input;
public string Input
{
get { return input; }
set { input = value; }
}
private string output;
public string Output
{
get { return output; }
set { output = value; }
}
}
步骤五:客户端代码
class Program
{
static void Main(string[] args)
{
Context c = new Context();
IList<AbstractExpression> list = new List<AbstractExpression>();
list.Add(new TerminalExpression());
list.Add(new NoterminalExpression());
list.Add(new NoterminalExpression());
list.Add(new TerminalExpression());
list.Add(new NoterminalExpression());
list.Add(new TerminalExpression());
foreach (AbstractExpression exp in list )
{
exp.Interpret(c);
}
Console.Read();
}
}
【总结】
一、如果一种特定类型的问题发生的频率比较高,就可以构建一个解释器,该解释器通过解释这些句子来解释问题
二、当有以一个语言需要解释执行并且可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式
三、很容易的改变和拓展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或拓展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类实实现大体类似,这些类都属于直接编写