设计模式之解释器模式(Interpreter)


意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用:
当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
而当存在以下情况时该模式效果最好:
1、该文法相对简单。对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
2、效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
参与者:
AbstractExpression
TerminalExpression
Context
Client
效果:
1、易于改变和扩展文法;
2、易于实现文法;
3、增加了新的解释表达式的方式,可通过访问者模式创建新的解释表达式的方式;
缺点:
复杂的文法难于维护,文法非常复杂时,可使用语法分析程序或编译器生成器更合适;
实现:
1、创建抽象语法树:该模式不涉及语法分析,从而不必涉及到语法树的创建。抽象语法树的创建可以通过client,亦可由表驱动的语法分析程序生成或手写的(递归下将法)语法分析程序生成;
2、定义解释操作:解释操作并不一定要放到表达式类中,如果经常需要添加一种操作,可以将其作为一个访问者;
3、通过享元模式共享终结符:终结符通常不存储它们在抽象语法树中的位置信息;
相关:Composite[一般用其表示]、Flyweight[共享终结符点]、Iterator[迭代器遍历结点]与Visitor[实现行为]
延伸:
Microsoft:我尝试在微软的框架中寻找该模式的应用,CodeDom与XMLDocument均只是用来表示文档对象模型,并没有采用解释器模式。关于Linq中的Expression是否是采用解释器模式,我也没有仔细分析,毕竟Linq文法本身属性框架内的东西,微软没有必要将相关细节public,然而从实现上来说,完全可能基于解释器模式。在Linq中的Expression实现上,文法结构树可通过静态成员来实现,Expression本身可用来表示一个文法实例上下文(Context)。Reduce可作为解释器的一个行为。
Sysnet:
C#
下面一段C#代码用来进行将字符串中的相关替代符替换成对象或xml结点值,其语法描述大值如下:
beginstring
@#!
 {.tostring()}%原义字符%
 @#^
  %原义字符%{xpath表达式}
 #@
#@
endstring
这是其中一段代码:

public interface IStringExpressionInterpreter
    {
        void Interpreter(IStringContext context, ExpressionDocument document);
    }
/// <summary>
/// 解析总的表达式
/// </summary>
    class ExpressionInterpreter : IStringExpressionInterpreter
    {
        static StringInterpreter StringInterpreter = new StringI
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释器模式Interpreter Pattern)是一种行为型设计模式,它定义了一种语言文法的表示,并定义了一个解释器,用于解释语言中的句子。它将一个问题分成两个部分:一部分是语言的文法规则,另一部分是解释器,用来解释规则中的句子。解释器模式可以用于处理一些简单的语言,如数学表达式、正则表达式等。 实现方式: 1. 定义抽象表达式类(AbstractExpression),它是所有表达式类的父类,声明了抽象的解释方法。 2. 定义终结符表达式类(TerminalExpression),它实现了抽象表达式类中的解释方法,用于解释语言中的终结符。 3. 定义非终结符表达式类(NonterminalExpression),它也实现了抽象表达式类中的解释方法,用于解释语言中的非终结符。 4. 定义上下文类(Context),它包含了解释器需要的一些全局信息。 5. 客户端使用时,先创建一个上下文对象,然后将需要解释的语言句子作为参数传入解释器对象中,解释器对象将句子解释成相应的结果。 优点: 1. 可扩展性好,增加新的文法规则只需要添加相应的非终结符表达式类即可。 2. 易于实现语法分析。 缺点: 1. 对于复杂的文法规则,解释器模式的类数量可能会很大,增加程序的复杂性。 2. 执行效率较低,因为需要递归调用解释器对象。 适用场景: 1. 可以用于处理一些简单的语言,如数学表达式、正则表达式等。 2. 当语言的文法规则比较复杂时,可以使用解释器模式进行语法分析。 3. 当需要对语言进行增强时,可以使用解释器模式添加新的文法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值