Интернет магазин китайских планшетных компьютеров



Компьютеры - Интерпретатор (шаблон проектирования)

30 марта 2011





Шаблон Интерпретатор — поведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям, задачу. Также известен как Little Language

Преимущества

Грамматику становится легко расширять и изменять, реализации классов, описывающих узлы абстрактного синтаксического дерева похожи. Можно легко изменять способ вычисления выражений.

Пример

Задача поиска строк по образцу может быть решена посредством создания интерпретатора, определяющего грамматику языка. "Клиент" строит предложение в виде абстрактного синтаксического дерева, в узлах которого находятся объекты классов "НетерминальноеВыражение" и "ТерминальноеВыражение", затем "Клиент" инициализирует контекст и вызывает операцию Разобрать. На каждом узле типа "НетерминальноеВыражение" определяется операция Разобрать для каждого подвыражения. Для класса "ТерминальноеВыражение" операция Разобрать определяет базу рекурсии. "АбстрактноеВыражение" определяет абстрактную операцию Разобрать, общую для всех узлов в абстрактном синтаксическом дереве. "Контекст" содержит информацию, глобальную по отношению к интерпретатору.

Пример на PHP5

<?php
interface IExpression
{
        function Interpret;
}
 
class Number implements IExpression
{
        public $number;
        public function Number { $this->number = $number; }
        public function Interpret { return $this->number; }
}
 
abstract class BasicOperation implements IExpression
{
        public $leftOperator;
        public $rightOperator;
 
        public function BasicOperation
        {
                $this->leftOperator = $left;
                $this->rightOperator = $right;
        }
 
        public function Interpret
        {
                $p=$this->leftOperator->Interpret;
                $t=$this->rightOperator->Interpret;
                return $this->Execute;
        }
 
        abstract function Execute;
}
 
class Plus extends BasicOperation
{
        //public function Plus { }
 
        function Execute
        {
                return $left + $right;
        }
}
 
class Minus extends BasicOperation
{
        //public function __construct { }
 
        function Execute
        {
                return $left - $right;
        }
}
 
class Variable implements IExpression
{
        private $name;
 
        public function Variable { $this->name = $name; }
 
        public function Interpret
        {
 
                return $variables;
        }
}
 
class Evaluator
{
        private $syntaxTree;
        public function __construct
        {
                $expression = explode;
                foreach 
                {
                        if 
                        $stack = new Plus, array_pop);
                        else if 
                        $stack = new Minus, array_pop);
                        else
                        $stack = new Variable;
                }
                $this->syntaxTree = array_pop;
        }
 
        public function Evaluate
        {
                return $this->syntaxTree->Interpret;
        }
}
 
$evaluator = new Evaluator;
$values = array;
$values= 5;
$values= 8;
$values= 15;
print);
 
 
?>




Просмотров: 1221


<<< Идиома copy-and-swap
Интерфейс (шаблон проектирования) >>>