Home > Backend Development > PHP Tutorial > An in-depth analysis of the interpreter pattern of PHP design patterns_PHP tutorial

An in-depth analysis of the interpreter pattern of PHP design patterns_PHP tutorial

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-07-21 15:07:12
Original
856 people have browsed it

Interpreter mode, which consists of a grammar representation with a composite class hierarchical structure. The rules are mapped to classes. The expressions following the grammar can be converted into an abstract syntax tree, except for the composite mode. There is nothing other than the instance object graph.

Tree is an abstract noun, because in fact most of the time it is an abstract representation of an expression, which ignores that there may be a string or a concrete expression of a data structure, (for example, in PHP , "A" and "x41" are different concrete manifestations of the same abstract literal value), and the results are decoupled through logical rules, greatly simplifying the interpretation process.

Interpreter is not a very common pattern, but for simple syntaxes, it is as easy to add a rule as adding a class, but it does not solve the conversion from concrete representation to abstract syntax tree, which is done by other services Completed.

The Interpreter pattern is designed to leverage a composite hierarchical structure for a simple AbstractExpression method (interpreter operation). The parameters of the interpreter operation are usually collectively called the context. For a given method , they are often replaced by calculated values, or they may not exist for some operations.

Likewise, when an interpreter is included, the leaf and container participants of a composite pattern have different names, reflecting the role they play: terminal or nonterminal expressions.

Participants:
◆Client: Use explain operation.
◆Abstract Expression: Abstract based on an expression tree.
◆NonTerminalExpression: An expression that recursively contains other abstract expressions (AbstractExpression instances).
◆Terminal Expression: An expression that cannot be further simplified.


The book "Design Patterns" provides an extended example for this pattern. I remodeled it by replacing the Boolean expression with a mathematical expression, so this example solves a mathematical expression. expression, its evaluate() is separated into a different ConcreteExpression class.

Copy code The code is as follows:

/** 
 * AbstractExpression. All implementations of this interface 
 * are ConcreteExpressions. 
 */
interface MathExpression 

    /** 
     * Calculates the value assumed by the expression. 
     * Note that $values is passed to all expression but it 
     * is used by Variable only. This is required to abstract 
     * away the tree structure. 
    */
    public function evaluate(array $values); 


/** 
 * A terminal expression which is a literal value. 
 */
class Literal implements MathExpression 

    private $_value; 

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

    public function evaluate(array $values) 
    { 
        return $this->_value; 
    } 


/** 
 * A terminal expression which represents a variable. 
 */
class Variable implements MathExpression 

    private $_letter; 

    public function __construct($letter) 
    { 
        $this->_letter = $letter; 
    } 

    public function evaluate(array $values) 
    { 
        return $values[$this->_letter]; 
    } 


/** 
 * Nonterminal expression. 
 */
class Sum implements MathExpression 

    private $_a; 
    private $_b; 

    public function __construct(MathExpression $a, MathExpression $b) 
    { 
        $this->_a = $a; 
        $this->_b = $b; 
    } 

    public function evaluate(array $values) 
    { 
        return $this->_a->evaluate($values) + $this->_b->evaluate($values); 
    } 


/** 
 * Nonterminal expression. 
 */
class Product implements MathExpression 

    private $_a; 
    private $_b; 

    public function __construct(MathExpression $a, MathExpression $b) 
    { 
        $this->_a = $a; 
        $this->_b = $b; 
    } 

    public function evaluate(array $values) 
    { 
        return $this->_a->evaluate($values) * $this->_b->evaluate($values); 
    } 


// 10(a + 3) 
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3))); 
echo $expression->evaluate(array('a' => 4)), "n"; 
// adding new rules to the grammar is easy: 
// e.g. Power, Subtraction... 
// thanks to the Composite, manipulation is even simpler: 
// we could add substitute($letter, MathExpression $expr) 
// to the interface...

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/327555.htmlTechArticle解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象...
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template