解释器模式和php实现

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

角色:
  环境角色:定义解释规则的全局信息。
  抽象解释器::定义了部分解释具体实现,封装了一些由具体解释器实现的接口。
  具体解释器(MusicNote):实现抽象解释器的接口,进行具体的解释执行。

UML图:

    

代码实现:

<?php
//环境角色,定义要解释的全局内容
class Expression{
    public $content;
    function getContent(){
        return $this->content;
    }
}

//抽象解释器
abstract class AbstractInterpreter{
    abstract function interpret($content);
}

//具体解释器,实现抽象解释器的抽象方法
class ChineseInterpreter extends AbstractInterpreter{
    function interpret($content){
        switch($content){
            case ‘0‘: echo "没有人";break;
            case "1": echo "一个人";break;
            case "2": echo "二个人";break;
            case "3": echo "三个人";break;
            case "4": echo "四个人";break;
            case "5": echo "五个人";break;
            case "6": echo "六个人";break;
            case "7": echo "七个人";break;
            case "8": echo "八个人";break;
            case "9": echo "九个人";break;
            default:echo "其他";
        }
    }
}
class EnglishInterpterer extends AbstractInterpreter{
    function interpret($content){
         switch($content){
            case ‘0‘: echo "This is nobody";break;
            case "1": echo "This is one people";break;
            case "2": echo "This is two people";break;
            case "3": echo "This is three people";break;
            case "4": echo "This is four people";break;
            case "5": echo "This is five people";break;
            case "6": echo "This is six people";break;
            case "7": echo "This is seven people";break;
            case "8": echo "This is eight people";break;
            case "9": echo "This is nine people";break;
            default:echo "others";
        }
    }
}

//封装好的对具体解释器的调用类,非解释器模式必须的角色
class Interpreter{
     private $interpreter;
     private $content;
     function __construct(){
         $expression = new Expression();
        $this->content = $expression->getContent();
        if($content[0] == "Chinese"){
             $this->interpreter = new ChineseInterpreter();
         }else{
              $this->interpreter = new EnglishInterpreter();
         }
     }
     function execute(){
         $this->interpreter->interpret($this->content);
     }
}

//测试
Expression::$content = array("Chinese",3,2,4,4,5);
$interpreter = new Interpreter();
$interpreter->execute();
Expression::$content = array("English",3,2,4,4,5);
$interpreter = new Interpreter();
$interpreter->execute();
?>

适用性:
  当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
  该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
  效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。

时间: 2024-10-13 19:42:41

解释器模式和php实现的相关文章

解释器模式 Interpreter

代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 解释器模式包含四个角色: 1)抽象表达式(AbstractExpress):声明抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类. 2)终结符表达式(TerminalExpress):是抽象表达式的子类,实现了与文法中的终结符相关联的解释操作,句子中的每一个终结符都是该类的一个实例.

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

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

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

Java解释器模式`

解释器模式提供了一种评估计算语言语法或表达式的方法. 这种类型的模式属于行为模式. 这种模式涉及实现一个表达式接口,它告诉解释一个指定的上下文. 此模式用于SQL解析,符号处理引擎等. 实现示例 我们将创建一个接口Expression并且在具体的类实现这个Expression接口. 定义了一个TerminalExpression类,用作所讨论的上下文的主解释器. 其他的类 - OrExpression和AndExpression用于创建组合表达式. InterpreterPatternDemo这

《JAVA与模式》之解释器模式

解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 解释器模式的结构 下面就以一个示意性的系统为例,讨论解释器模式的结构.系统的结构图如下所示: 模式所涉及的角色如下所示: (1)抽象表达式(Expression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口.这个接口主要是一个interpret()方法,称做解释操作. (2)终结符表达式(Terminal Expression)角色:

解释器模式(Interpreter Pattern)

解释器模式:为语言创建解释器,提供评估语言的语法或表达式的方法. 例子: public interface Expression { public abstract boolean interpret(String context); } public class TerminalExpression implements Expression { private String data; public TerminalExpression(String data) { this.data =

行为型模式之解释器模式

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

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

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

php设计模式之解释器模式

解释器设计模式用于分析一个实体的关键元素,并且针对每个元素都提供自己的解释或相应的动作. <?php /** * 解释器模式 */ class User { protected $_username; public function __construct($username) { $this->_username = $username; } public function getProfilePage() { $profile = "<h2>I like never