设计模式之解释器模式--语法解释器的实现原理

设计模式之解释器模式–语法解释器的实现原理

解释器模式就是把一个东西解释成另外一个东西,比如中文解释成英文。

给定一个语言,定义它的文法的一种表示,比定义一个解释器,这个解释器使用该表示来解释语言中的句子。

为什么要使用解释器模式

当你需要解释一个东西的时候,这个模式才能发生作用。

这个模式在实际项目中用的比较少,除非写一些通用框架的时候才会用到。一般在框架和语言层面使用。

比如java解释器,php解释器这些语言解释器,还有mysql里面的语法解释器这些需特定语法的才需要这个模式。

比如正则,当使用正则的时候就会使用到正则解释器

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

比如实现一个数学解释器

php实现解释器模式

首先实现一个解释器父类

/**
 * 解释器模式
 * 语法解释器父类
 */
abstract class Expression {

    /**
     * 解释器方法
     * 负责解释语法
     * 接受一个解释文本类
     */
    function interpreter(Context $ctx) {
        $arr = explode(' ', $ctx->text);
        //取出相加的两个数和符号
        $num1 = array_shift($arr);
        $symbol = array_shift($arr);
        $num2 = array_shift($arr);
        
        //把已经解释的文本去掉
        $ctx->text = implode(' ', $arr);

        //调用具体的语法解释器
        $this->exec($num1, $num2, $symbol);
    }

    /**
     * 具体的语法解释执行
     */
    abstract function exec($num1, $num2, $symbol);
}

接下来实现一个加法解释器

/**
 * 解释器模式
 * 加法解释器
 */
class plus extends Expression {

    /**
     * 具体的语法解释执行
     */
    function exec($num1, $num2, $symbol) {
        if ($symbol == '+') {
            dump($num1 + $num2);
        }
    }
}

在来一个解释文本类,负责装着文本。

/**
 * 解释器模式
 * 解释文本
 */
class Context {

    public $text;
}

现在看一下客户端调用

$ctx = new Context;
$ctx->text = '1 + 1';
$plus = new plus;
$plus->interpreter($ctx);

经过解释器解析后输出下面的内容

2

可以看到解释器发生了作用。

解释器的结构

  • 抽象解释类
  • 具体解释类
  • 解释文本

代码放在了我的github上面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章