解释器【Interpreter】

实例

abstract class Expression
{
    public abstract function Interpreter(Content $content);
}
class Content
{
    private $content = '';
    public function getContent(): string
    {
        return $this->content;
    }
    public function setContent(string $content)
    {
        $this->content = $content;
    }
}

class EnglishExpression extends Expression
{
    public function Interpreter(Content $content)
    {
        $translate = [
            '你好' => 'hello'
        ];
        echo $translate[$content->getContent()] 
            ?? 'untranslatable', PHP_EOL;
    }
}
class ChineseExpression extends Expression
{
    public function Interpreter(Content $content)
    {
        $translate = [
            'world' => '世界'
        ];
        echo $translate[$content->getContent()] 
            ?? 'untranslatable', PHP_EOL;
    }
}
$content = new Content();
$content->setContent('world');
$syntax = [];
array_push($syntax, new EnglishExpression());
array_push($syntax, new ChineseExpression());
foreach ($syntax as $v) {
    $v->interpreter($content);
}
/*
untranslatable
世界
*/

总结

解释器模式通过将语言的文法表示为抽象语法树,并定义一个解释器来递归解析句子,适用于处理简单且固定的语言或重复出现的问题。

意图

给定一个语言,定义其文法表示(即抽象语法树),并定义一个解释器来解释该语言的句子。

主要解决

为一些固定文法(语言类型问题发生频率高)构建解释句子的解释器。

何时使用

构建抽象语法树,其中包含终结符(基本元素)和非终结符(组合规则),并通过递归调用方法来解释句子。

如何解决

构建语法树,定义终结符与非终结符。

关键代码

依赖于一个环境类(通常是 HashMap)来存储解释器所需的全局信息。

优点

缺点

使用场景

注意事项

可利用场景比较少,JAVA 中如果碰到可以用 expression4J 代替。