/******************************************************************
* 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,
* 这个解释器使用该表示来解释语言中的句子。
*
* 适用性:
* 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个
* 抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
* 1、该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时
* 语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法
* 树即可解释表达式, 这样可以节省空间而且还可能节省时间。
* 2、效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树
* 实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转
* 换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模
* 式仍是有用的。
*
*协作:
*1、Client构建(或被给定)一个句子,它是NonterminalExpression和TerminalExpression
* 的实例的一个抽象语法树,然后初始化上下文并调用解释操作。
* 2、每一个非终结符表达式节点定义相应子表达式的解释操作。而个终结符表达
* 式的解释操作构成了递归的基础。
* 3、每一节点的解释操作用上下文来存储和访问解释器的状态。
*
* 作者:董怀信
* 日期:2009-06-07
* ***************************************************************/
using System;
namespace DesignPattern.BehavioralPattern
{
///
/// 包含解释器之外的一些全局信息。
///
public class Context
{
//1+1
private string m_content;
public Context(string content)
{
m_content = content;
}
public string GetContent()
{
return m_content;
}
}
///
/// 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
///
public abstract class AbstractExpression
{
public abstract int Interpret(Context context);
}
///
///1、 实现与文法中的终结符相关联的解释操作。
///2、 一个句子中的每一个终结符需要该类的一个实例。
///
public class TerminalExpression:AbstractExpression
{
public override int Interpret(Context context)
{
int i;
string strValue = context.GetContent().Trim();
Console.WriteLine("TerminalExpresson Context Content:" + strValue);
if (int.TryParse(strValue, out i))
{
return i;
}
return 0;
}
}
///
/// 1、对文法中的每一条规则R::=R1R2...Rn都需要一个NonterminalExpression类。
/// 2、从R1到Rn中的每一个符号都维护一个AbstractExpression类型的实例变量。
/// 3、为文法中的非终结符实现解释(Interpret)操作。解释一般要递归地调用表示
/// R1到Rn的那些对象的解释操作。
///
public class NonterminalExpression : AbstractExpression
{
private AbstractExpression m_expressionA;
private AbstractExpression m_expressionB;
public NonterminalExpression(AbstractExpression expressionA,AbstractExpression expressionB)
{
m_expressionA = expressionA;
m_expressionB = expressionB;
}
public override int Interpret(Context context)
{
string content = context.GetContent().Trim();
Console.WriteLine("NonterminalExpression Context Content:");
int plusIndex = content.IndexOf('+');
Context contextA = new Context(content.Substring(0,plusIndex));
Context contextB = new Context(content.Substring(plusIndex + 1));
int vlaue = m_expressionA.Interpret(contextA) + m_expressionB.Interpret(contextB);
return vlaue;
}
}
///
/// 1、构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树
/// 由NonterminalExpression和TerminalExpression的实例装配而成。
/// 2、调用解释操作。
///
public class Client
{
public void Test()
{
string content = "3 + 4";
Context context = new Context(content);
AbstractExpression a = new TerminalExpression();
AbstractExpression b = new TerminalExpression();
AbstractExpression expression = new NonterminalExpression(a, b);
int result = expression.Interpret(context);
Console.WriteLine(content + " = " + result.ToString());
}
}
}