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

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>";
    }

}
?>

问题

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

 

posted @ 2016-11-16 11:17  rcj_飞翔  阅读(219)  评论(0编辑  收藏  举报