解释器模式(26)

今天我们来讲一下解释器模式。

什么叫解释器模式呢?解释器模式,给定一个语言,定义她的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子,这样就可以构建一个解释器,该解释器通过/解释这些句子来解决该问题。

下面我们来看一下她的结构代码:

 1     //抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
 2     abstract class AbstractExpression
 3     {
 4         public abstract void Interpret(Context comtext);
 5     }
 6
 7     //包含解释器之外的一些全局信息
 8     public class Context
 9     {
10         private string input;
11         private string output;
12         public string Input
13         {
14             get
15             {
16                 return input;
17             }
18
19             set
20             {
21                 input = value;
22             }
23         }
24
25         public string Output
26         {
27             get
28             {
29                 return output;
30             }
31
32             set
33             {
34                 output = value;
35             }
36         }
37     }
38
39     //终结符表达式,实现与文法中终结符相关联的解释操作
40     //实现抽象表达式中所要求的接口,主要是一个方法,文法中每一个终结符都有一个
41     //具体中介表达式与之相对应。
42     class TerminalExpression : AbstractExpression
43     {
44         public override void Interpret(Context comtext)
45         {
46             Console.WriteLine("终端解释器");
47         }
48     }
49
50     //非终结符表达式,为文法中的非终结符实现解释操作,对文法中每一条规则
51     //都需要一个具体的非终结符表达式类。通过实现抽象表达式方法,实现解释操作。
52     //解释操作以递归方式调用上面所提到的每一条规则中各个符号的实例变量.
53     class NonterminalExpression:AbstractExpression
54     {
55         public override void Interpret(Context comtext)
56         {
57             Console.WriteLine("非终端解释器");
58         }
59     }

客户端调用:

 1         public static void Main()
 2         {
 3             Context context = new Context();
 4
 5             IList<AbstractExpression> list = new List<AbstractExpression>();
 6             list.Add(new TerminalExpression());
 7             list.Add(new NonterminalExpression());
 8             list.Add(new TerminalExpression());
 9             list.Add(new TerminalExpression());
10
11             foreach (AbstractExpression exp in list)
12             {
13                 exp.Interpret(context);
14             }
15             Console.ReadKey();
16         }

那么,在什么时候我们用解释器模式呢?

通常,当有一个语言需要解释执行,并且你可以讲该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。

解释器模式有什么优点吗?

1、容易地盖面和拓展文法,因为该模式使用类来表示文法规则,你可使用继承来改变和扩展该文法。

2、较容易实现文法, 因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。

嗯,今天解释器模式就讲到这里了,可能没有举案例,等整理好案例,我再发一下。下一篇我们讲 访问者模式



本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持

时间: 2024-11-05 11:55:34

解释器模式(26)的相关文章

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

【设计模式】15.解释器模式

1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:演奏文本 6 * 时间:2016年3月3日上午9:26:19 7 * 作者:cutter_point 8 */ 9 public class PlayContext 10 { 11 private String text; 12 13 public PlayContext() 14 { 15 } 16 17 public PlayContext(String tex

行为型设计模式之解释器模式(Interpreter)

结构 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式.而当存在以下情况时该模式效果最好: 该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理.此时语法分析程序生成器这样的工具是更好的选择.它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间. 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现

大话设计模式Python实现-解释器模式

解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式--解释器模式 8 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种

解释器模式 Interpreter

代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 解释器模式包含四个角色: 1)抽象表达式(AbstractExpress):声明抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类. 2)终结符表达式(TerminalExpress):是抽象表达式的子类,实现了与文法中的终结符相关联的解释操作,句子中的每一个终结符都是该类的一个实例.

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

Head First设计模式之解释器模式

一.定义 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题. 如何解决:构件语法树,定义终结符与非终结符. 二.结构 组成: AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作. Termi

Java解释器模式`

解释器模式提供了一种评估计算语言语法或表达式的方法. 这种类型的模式属于行为模式. 这种模式涉及实现一个表达式接口,它告诉解释一个指定的上下文. 此模式用于SQL解析,符号处理引擎等. 实现示例 我们将创建一个接口Expression并且在具体的类实现这个Expression接口. 定义了一个TerminalExpression类,用作所讨论的上下文的主解释器. 其他的类 - OrExpression和AndExpression用于创建组合表达式. InterpreterPatternDemo这