設計模式之解釋器模式--語法解釋器的實現原理

設計模式之解釋器模式–語法解釋器的實現原理

解釋器模式就是把一個東西解釋成另外一個東西,比如中文解釋成英文。

給定一個語言,定義它的文法的一種表示,比定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

爲什麼要使用解釋器模式

當你需要解釋一個東西的時候,這個模式才能發生作用。

這個模式在實際項目中用的比較少,除非寫一些通用框架的時候纔會用到。一般在框架和語言層面使用。

比如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上面。

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