`

InterpreterPattern

 
阅读更多

意图
给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子.

 

比如说对任何一种语言,已经把它语法的解释都已经解释出来了,接着这个语言的任何一个句子我都可以对它进行解释.

 

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

 

构成:
1.抽象表达式角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个Interpreter()方法,称作解释操作.


2.终结符表达式角色:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法.
--文法中的每一个终结符都有一个具体终结表达式与之相对应.


3.非终结符表达式:这是一个具体角色
--实现了抽象表达式角色所要求的接口,主要是一个Interpret()方法
--解释操作以递归方式进行调用
(非终结符表达式可以包含若干个终结符表达式,就像一个枝节点可以包含若干个叶节点,两者之间是一种一对多的关系,非终结符表达式可以递归调用终结符表达式,还有一种情况就是非终结符表达式里面还可以包含若干个终结符表达式.)


4.环境角色:提供解释器之外的一些全局信息(对解释器提供额外的操作等)


5.客户端角色:调用解释操作Interpret.

 

 

对于一个布尔表达式它有多种可能,比如说:我们可以定义一个常量true或false,另外定义一个变量,这个变量可以稍后给它赋值,先定义好变量,具体值是什么可以最后给它赋上,并且还可以去改变它的值,还可以定义布尔表达式的与&&操作,或||操作,非!操作.

我们可以模拟一个具体的表达式,这个表达式就是一个布尔表达式,它可能是多个布尔表达式组成的一个整体,然后最终我们求得这个结果,里面肯定要涉及到若干的表达式的与,或,非,这里的每个操作都涉及到一个解释,比如两个bool表达式它们进行操作的时候,这就是一种解释器的行为,我们可以将这里面每种可能出现的情况都把它提取出来,作为我们的终结符表达式,比如说我们定义了与&&这样一个操作,那么这样就形成两个布尔表达式,它们具体结果是真还是假,我们是在终结符表达式里面执行的判断.

 

(图片看不清可点击得到图片原始大小)

ClassDiagram:

 

 

SequenceDiagram:

当调用非终结符表达式的时候,它又可以去调用它所包含的其他的非终结符表达式以及终结符表达式,通过这样一个递归的调用关系就实现了不断的解释这样一个过程.

  

 InterpreterPattern示例意图:

解释布尔表达式的解释器,布尔表达式有多种情况比如:常量和常量,变量和变量,常量和变量, 相应的还有与(&&),或(||)非(!)几种操作,要把它们都实现出来,因此我要定义一个常量,一个变量,再去定义与And,或Or,非Not,这样几种操作,然后给出一个复杂的布尔表达式,通过所提供的解释器对给出复杂的布尔表达式进行解释,然后获得我想要的结果.

 

class Client
    {
        static void Main(string[] args)
        {
            Context context = new Context();

            Variable x = new Variable("x");
            Variable y = new Variable("y");

            Constant c = new Constant(true);

            context.Assign(x, false);
            context.Assign(y, true);

            Expression exp = new Or(new And(c, x), new And(y, new Not(x)));

            Console.WriteLine("x={0}", x.Interpret(context));

            Console.WriteLine("y={0}", y.Interpret(context));

            Console.WriteLine("exp={0}", exp.Interpret(context));

            Console.ReadKey();
        }
    }

    /// <summary>
    /// 抽象表达式角色
    /// </summary>
    public abstract class Expression
    {
        //抽象表达式角色依赖与环境角色来进行相应的解释.
        public abstract bool Interpret(Context context);
    }

    /// <summary>
    /// 环境角色
    /// </summary>
    public class Context
    {
        //环境角色主要提供一些全局性的操作(通用的操作).
        //该例子定义的通用性的操作:定义一个变量给变量赋值,查找变量值.
        private Hashtable table = new Hashtable();

        /*通过客户端定义变量给相应的变量赋值存放在HashTable里.
         * 该变量只有两种可能true和false; */
        public void Assign(Variable var, bool value)
        {
            table.Add(var, value);
        }

        //取出变量的值.
        public bool Lookup(Variable var)
        {
            return (Boolean)table[var];
        }
    }

    /// <summary>
    /// 终结符表达式角色
    /// </summary>
    public class Variable : Expression
    {
        //该类定义了一个变量
        /*它里面只能定义true和false所以它是一个
        终结符表达式.*/
        private string name;

        public Variable(string s)
        {
            name = s;
        }

        public override bool Interpret(Context context)
        {
            return context.Lookup(this);
        }
    }

    /// <summary>
    /// 终结符表达式角色
    /// </summary>
    class Constant : Expression
    {
        //该类定义了一个常量
        /*它里面只能定义true和false所以它是一个
        终结符表达式.*/
        bool value;

        public Constant(bool v)
        {
            value = v;
        }

        public override bool Interpret(Context context)
        {
            return value;
        }

    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class And : Expression
    {
        //该类定义与(&&)的操作
        /*非终结符表达式它里面会包含
        若干个非终结符表达式及终结符表达式*/

        Expression left;
        Expression right;

        public And(Expression l, Expression r)
        {
            left = l;
            right = r;
        }

        public override bool Interpret(Context context)
        {
            return left.Interpret(context) && right.Interpret(context);
        }

    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class Or : Expression
    {
        //该类定义与(||)的操作
        /*非终结符表达式它里面会包含
        若干个非终结符表达式及终结符表达式*/

        Expression left;
        Expression right;

        public Or(Expression l, Expression r)
        {
            left = l;
            right = r;
        }

        public override bool Interpret(Context context)
        {
            return left.Interpret(context) || right.Interpret(context);
        }
    }

    /// <summary>
    /// 非终结符表达式
    /// </summary>
    class Not : Expression
    {
        //该类定义与(||)的操作,
        /*该类可包含一个终结符表达式或
       非终结符表达式所以它是非终结符表达式*/

        Expression exp;

        public Not(Expression e)
        {
            exp = e;
        }

        public override bool Interpret(Context context)
        {
            return !exp.Interpret(context);
        }
    }

 

  • 大小: 50.6 KB
  • 大小: 47.1 KB
分享到:
评论

相关推荐

    InterpreterPattern.rar

    本项目“InterpreterPattern.rar”是基于Qt C++框架开发的一个计算器应用程序,巧妙地融合了解析器模式和状态机模式,旨在帮助开发者更好地理解和应用这两种设计模式。 首先,让我们深入解析器模式(Interpreter ...

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

    **设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...

    [行为型模式] 解释器模式的理解

    首先,我们来看`InterpreterPattern.cpp`和`InterpreterPattern.h`这两个文件,它们很可能是实现解释器模式的核心代码。`InterpreterPattern.h`可能包含了模式的主要接口定义,而`InterpreterPattern.cpp`则实现了...

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    c++-设计模式之解释器模式(Interpreter)

    解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言的句法定义一个解释器。它通过定义一个语言的文法表示以及解释器的实现来解析和执行表达式。这种模式通常用于设计语言、脚本或规则引擎。 ...

    C#设计模式_设计模式_C#_

    解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor ...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    23种设计模式 (创建型,结构型,行为型)

    解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者...

    设计模式代码——c#

    17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者...

    用Java实现23种设计模式

    解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式...

    设计模式PPT

     解释器模式(Interpreter Pattern)  迭代器模式(Iterator Pattern)  中介者模式(Mediator Pattern)  备忘录模式(Memento Pattern)  观察者模式(Observer Pattern)  状态模式(State Pattern)...

    C++设计模式课件25_Interpreter.pdf

    从提供的文件信息中,我们可以推断该课件《C++设计模式课件25_Interpreter.pdf》是关于C++语言实现设计模式中的解释器模式(Interpreter Pattern)的一部分教学资料。文件中出现的网站***和网易云课堂是指两个在线...

    33种JAVA设计模式DEMO

    解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式(Memento Pattern) 观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null ...

    32种设计模式

    解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) ...

    design-pattern-java.pdf

    请求发送者与接收者解耦——命令模式(六) 解释器模式-Interpreter Pattern 自定义语言的实现——解释器模式(一) 自定义语言的实现——解释器模式(二) 自定义语言的实现——解释器模式(三) 自定义语言的实现...

    liang-faan_JavaDesignPattern.pdf

    文档中还提到了其他一些行为型设计模式,如命令模式(Command Pattern)、解释器模式(Interpreter Pattern)、迭代器模式(Iterator Pattern)、中介者模式(Mediator Pattern)、备忘录模式(Memento Pattern)、...

    Java设计模式学习教程与案例源码.zip

    9. [解释器模式](worthed/OriginBlog/blob/master/articles/InterpreterPattern.md) 10. [访问者模式](worthed/OriginBlog/blob/master/articles/VisitorPattern.md) 11. [中介者模式](worthed/OriginBlog/blob/...

    软件架构23种设计模式

    还有其他的设计模式,例如代理模式(Proxy Pattern)、享元模式(Flyweight Pattern)、责任链模式(Chain of Responsibility Pattern)、命令模式(Command Pattern)、解释器模式(Interpreter Pattern)、迭代器...

Global site tag (gtag.js) - Google Analytics