执行及描述任务-------解释器模式

uml

代码实现

<?php
//interpreter.php

abstract class Expression{
    private static $keycount = 0;
    private $key;

    //解释
    abstract function interpret(InterpreterContext $context);

    function getKey(){
        if(!isset($this->key)){
            self::$keycount++;
            $this->key = self::$keycount;
        }
        return $this->key;
    }
}

abstract class OperatorExpression extends Expression{
    protected $l_op;
    protected $l_rp;

    function __construct(Expression $l_op,Expression $l_rp)
    {
        $this->l_op = $l_op;
        $this->l_rp = $l_rp;
    }

    function interpret(InterpreterContext $context)
    {
        $this->l_op->interpret($context);
        $this->l_rp->interpret($context);
        $result_l = $context->lookup($this->l_op);
        $result_r = $context->lookup($this->l_rp);
        $this->doInterpret($context,$result_l,$result_r);
    }

    protected abstract function  doInterpret(InterpreterContext $context,$result_l,$result_r);

}

//定义相等表达式
class EqualsExpression extends OperatorExpression{
    protected function doInterpret(InterpreterContext $context,$result_l,$result_r)
    {
        $context->replace($this,$result_l==$result_r);
    }
}

//定义布尔或表达式
class BooleanOrExpression extends OperatorExpression{
    protected function doInterpret(InterpreterContext $context,$result_l,$result_r)
    {
        $context->replace($this,$result_l || $result_r);
    }
}

//定义布尔与表达式
class BooleanAndExpression extends OperatorExpression{
    protected function doInterpret(InterpreterContext $context,$result_l,$result_r)
    {
        $context->replace($this,$result_l && $result_r);
    }
}

//
class LiteralExpression extends Expression{
    private $value;

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

    function interpret(InterpreterContext $context){
        $context->replace($this,$this->value);
    }
}

//定义变量(赋值)
class VariableExpression extends Expression{
    private $name;
    private $val;

    function __construct($name,$val=null){
        $this->name = $name;
        $this->val = $val;
    }

    function interpret(InterpreterContext $context){
        if(!is_null($this->val)){
            $context->replace($this,$this->val);
            $this->val = null;
        }
    }

    function setValue($value){
        $this->val = $value;
    }

    function getKey(){
        return    $this->name;
    }
}

class InterpreterContext{
    private $expressionstore = array();

    function replace(Expression $exp,$value){
        $this->expressionstore[$exp->getKey()] = $value;
    }

    function lookup(Expression $exp){
        return $this->expressionstore[$exp->getKey()];
    }
}

$context = new InterpreterContext();
$input = new VariableExpression(‘input‘);

$statement = new BooleanOrExpression(
    new EqualsExpression($input,new LiteralExpression(‘four‘)),
    new EqualsExpression($input,new LiteralExpression(‘4‘))
);

foreach (array(‘four‘,‘4‘,‘52‘) as $val) {
    $input->setValue($val);
    echo "$val<br>";
    $statement->interpret($context);
    if($context->lookup($statement)){
        echo "top marks<br>";
    }else{
        echo "dunce hat on<br>";
    }

}
?>

问题

创建解释器模式的核心类后,解释器很容易扩展。但是语言变得复杂是,需要创建的类的数量会很快增加。因此解释器模式适用于相对小的语言,如果需要一个全能的编程语言,最好使用第三方工具。

时间: 2024-10-25 19:47:12

执行及描述任务-------解释器模式的相关文章

设计模式_Interpreter_解释器模式

形象例子: 俺有一个<泡MM真经>,上面有各种泡MM的攻略,比如说去吃西餐的步骤.去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了.解释器模式: 给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子.解释器 模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句.在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合.在解释器模式中需要定义一个代表文法的命令类的等

面向对象编程思想-解释器模式

一.引言 我们常常在会在字符串中搜索匹配字符或判断一个字符串是否符合我们要的格式时,使用正则表达式,可解决问题的背后是一种什么思想呢?即我们今天要学习的内容,解释器模式 二.解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子 1.文法:即语法规则.在解释器模式中每一个语法都对应一个解释器对象,用来处理相应的语法规则.它对于扩展.改变文法规则都很方便 2.可以通过抽象语法树(Abstract Syntax Tree,AST)的图形方式来

Java描述设计模式(14):解释器模式

本文源码:GitHub·点这里 || GitEE·点这里 一.解释器模式 1.基础概念 解释器模式是对象的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的表达式. 2.模式图解 3.核心角色 (1).抽象表达式 Express:声明具体表达式角色需要实现的抽象接口,该接口主要提供一个interpret()方法,称做解释操作. (2).终结符表达式 TerminalExpress:实现抽象表达式角色接口,主要是一个i

Head First设计模式之解释器模式

一.定义 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子.这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题. 如何解决:构件语法树,定义终结符与非终结符. 二.结构 组成: AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作. Termi

行为型模式之解释器模式

概述 解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器.在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则,这些问题的实例将对应为该语言中的句子.此时,可以使用解释器模式来设计这种新的语言.对解释器模式的学习能够加深我们对面向对象思想的理解,并且掌握编程语言中文法规则的解释过程 定义 解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立

第17章 行为型模式—解释器模式

1. 解释器模式(Interpreter Pattern)的定义 (1)定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. ①文法:即语法规则.在解释器模式中每一个语法都将对应一个解释器对象,用来处理相应的语法规则.它对于扩展.改变文法以及增加新的文法规则都很方便. ②解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子. ③在解释器模式中可以通过一种称之为抽象语法树(Abstract Syntax T

interpreter(解释器模式)

一.引子 其实没有什么好的例子引入解释器模式,因为它描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发编译器中:在实际应用中,我们可能很少碰到去构造一个语言的文法的情况. 虽然你几乎用不到这个模式,但是看一看还是能受到一定的启发的. 二.定义与结构 解释器模式的定义如下:定义语言的文法,并且建立一个解释器来解释该语言中的句子.它属于类的行为模式.这里的语言意思是使用规定格式和语法的代码. 在GOF的书中指出:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例

[设计模式-行为型]解释器模式(Interpreter)

一句话 看起来是用来解释一种语言的文法.(类似不同的解释器子类解释不同的字符) 和编译器类似的解释器, 实际状况可能使用的比较少. 概括 解析 INTERPRETER-俺有一个<泡MM真经>,上面有各种泡MM的攻略,比如说去吃西餐的步骤.去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了. 解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子.解释器模式将描述怎样在有了

设计模式解密(21)- 解释器模式

1.简介 定义:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子. 主要解决:对于一些固定文法构建一个解释句子的解释器. 本质:分离实现,解释执行.Interpreter模式其实就是一种简单的语法解释器构架. 英文:Interpreter 类型:行为型 2.类图及组成 (引)类图: 组成: AbstractExpression(抽象表达式):定义解释器的接口,约定解释器的解释操作. TerminalExpression(终结符表达式):用来实现语法规则中和