`

原始的解释器模式(Interpreter Pattern)

阅读更多

解释器模式的定义(现实项目中很少遇到,因此直接理论先。。。)

解释器模式是一种按照规定语法进行解析的方案,在现在项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。其构成如下:

1、AbstractExpression——抽象解释器

具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和NonterminalExpression完成

2、TerminalExpression——终结符表达式

实现与方法中的元素相关联的解释操作,通过一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。

3、NonterminalExpression——非终结符表达式

文法中的每条规则对应于一个非终结表达式。非终结符表达式根据逻辑的复杂程序而增加,原则上每个文法规则对应一个非终结符表达式。

4、Context——环境角色

 

 

那现在用解释器模式来解释一下四则运算(加减乘除),类图如下:


图中MathExpression为抽象解释器,Literal、Variable为终结符表达式,Sum、Multiply为非终结符表达式,结构很清晰。实现代码如下:

<?php

interface MathExpression
{
    public function evaluate( array $values );
}

/**
 * A terminal expression which is a literal value.
 */
class Literal implements MathExpression
{
    private $_value;

    public function __construct( $value ) {
        $this->_value = $value;
    }

    public function evaluate( array $values ) {
        return $this->_value;
    }
}

/**
 * A terminal expression which represents a variable.
 */
class Variable implements MathExpression
{
    private $_letter;

    public function __construct( $letter ) {
        $this->_letter = $letter;
    }

    public function evaluate( array $values ) {
        return $values[$this->_letter];
    }
}

/**
 * Nonterminal expression.
 */
class Sum implements MathExpression
{
    private $_a;
    private $_b;

    public function __construct( MathExpression $a, MathExpression $b ) {
        $this->_a = $a;
        $this->_b = $b;
    }

    public function evaluate( array $values ) {
        return $this->_a->evaluate( $values ) + $this->_b->evaluate( $values );
    }
}

/**
 * Nonterminal expression.
 */
class Multiply implements MathExpression
{
    private $_a;
    private $_b;

    public function __construct( MathExpression $a, MathExpression $b ) {
        $this->_a = $a;
        $this->_b = $b;
    }

    public function evaluate( array $values ) {
        return $this->_a->evaluate( $values ) * $this->_b->evaluate( $values );
    }
}

// 10(a + 3)
$expression = new Multiply( new Literal( 10 ), new Sum( new Variable( 'a' ), new Literal( 3 ) ) );
echo $expression->evaluate( array( 'a' => 111 ) ), "\n";

运行结果:1140
[Finished in 0.1s]

 

 

我们来看看这么写的优缺点

解释器模式的优点

解释器模式是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了。

 

解释器模式的缺点

1、解释器模式会引起类膨胀(感觉好多模式都有这个问题啊)

每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可以产生大量的类文件,为维护带来了非常多的麻烦。

2、解释器模式采用递归调用方法

每个终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的结果,必须一层一层地剥茧,无论是面向过程的语言还是面向对象的语言,递归都是在必要条件下使用的,它导致调试非常复杂。

3、效率问题

有递归自然就会有效率问题,特别是用于解释复杂冗长的语法时。

 

 

解释器模式的使用场景

1、重复发生的问题可以使用解释器模式

例如服务器日志的分析处理,由于各个服务器的日志模式不同,但是数据要素是相同的,按照解释器模式的说法就是终结符表达式都是相同的,但是非终结符表达式就需要制定了。

2、一个简单语法需要解释的场景

例如 SQL语法分析

 

 

解释器模式的注意事项

尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。在项目中可以使用shell,JRuby,Groovy等脚本语言代替解释器模式,弥补php效率上的不足。

 

 

一般在大中型的框架型项目能够找到它的身影,如一些数据分析工具,报表设计工具,科学计算工具等,若你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下Expression4J,MESP,Jep等开源的解析工具包,功能都异常强大,没必要自己从头编写解释器。

1
0
分享到:
评论

相关推荐

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

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

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

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

    解释器模式(Interpreter)原理图

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

    InterpreterPattern.rar

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

    设计模式----解释器模式

    解释器模式(Interpreter Pattern)是25种经典设计模式之一,主要应用于创建一个解析语言或者表达式的方式。在本篇文章中,我们将深入探讨解释器模式的概念、结构以及其在实际开发中的应用。 解释器模式是一种行为...

    C#版 24种设计模式

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

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

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

    用Java实现23种设计模式

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

    Python设计模式之解释器模式原理与用法实例分析

    解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -...

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

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

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

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

    Android编程设计模式之解释器模式详解

    解释器模式(Interpreter Pattern)是设计模式中的一种行为模式,主要用于解析特定语言或表达式。在Android开发中,尽管不常见,但当需要自定义简单的语言或者表达式解释执行时,解释器模式就显得尤为重要。 一、...

    设计模式PPT

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

    解释器模式

    其中,“解释器模式”(Interpreter Pattern)作为行为型设计模式之一,主要用于处理具有固定语法结构的语言或规则系统。本文将深入探讨解释器模式的核心概念、应用场景以及其实现方法。 #### 二、动机与背景 在...

    C++设计模式(Design Pattern)范例源代码

    解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    geekxh#hello-algorithm#解释器模式2

    介绍解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的

    设计模式代码——c#

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

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

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

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

    解释器模式(Interpreter Pattern)是一种行为设计模式,它允许我们定义一种语言的文法,并创建一个解释器来解析该语言的实例。在PHP中,解释器模式常用于处理简单的语言结构,例如计算表达式或者将特定格式的字符串...

    33种JAVA设计模式DEMO

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

Global site tag (gtag.js) - Google Analytics