Jump to content

Шаблон переводчика

В компьютерном программировании шаблон интерпретатора — это шаблон проектирования , который определяет, как оценивать предложения на языке. Основная идея состоит в том, чтобы иметь класс для каждого символа ( терминального или нетерминального ) на специализированном компьютерном языке . Синтаксическое дерево предложения на языке является экземпляром составного шаблона и используется для оценки (интерпретации) предложения для клиента. [1] : 243  См. также Составной шаблон .

Переводчик [2] шаблон проектирования — один из двадцати трех известных Шаблоны проектирования GoF которые описывают, как решать повторяющиеся проблемы проектирования для разработки гибкого и многократно используемого объектно-ориентированного программного обеспечения, то есть объектов, которые легче реализовать, изменить, протестировать и повторно использовать.

Какие проблемы может решить шаблон проектирования «Интерпретатор»?

[ редактировать ]

Источник: [3]

  • Должна быть определена грамматика . для простого языка
  • чтобы предложения на языке можно было интерпретировать.

Когда проблема возникает очень часто, ее можно представить в виде предложения на простом языке. ( Языки, специфичные для предметной области ), чтобы переводчик мог решить проблему интерпретируя предложение.

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

Какое решение описывает шаблон проектирования «Интерпретатор»?

[ редактировать ]
  • Определите грамматику простого языка, определив Expression иерархия классов и реализация interpret() операция.
  • Представляйте предложение на языке с помощью абстрактного синтаксического дерева (AST), состоящего из Expression экземпляры.
  • Интерпретируйте предложение, называя interpret() на АСТ.

Объекты выражений рекурсивно компонуются в составную/древовидную структуру, которая называется абстрактное синтаксическое дерево (см. Составной шаблон ).
Шаблон Interpreter не описывает, как построить абстрактное синтаксическое дерево. Это может выполняться либо вручную клиентом, либо автоматически анализатором .

См. также диаграмму классов и объектов UML ниже.

Использование

[ редактировать ]
  • Специализированные языки запросов к базе данных, такие как SQL .
  • Специализированные компьютерные языки, которые часто используются для описания протоколов связи.
  • Большинство компьютерных языков общего назначения фактически включают в себя несколько специализированных языков. [ нужна ссылка ] .

Структура

[ редактировать ]

Диаграмма классов и объектов UML

[ редактировать ]
Пример класса UML и объектной диаграммы для шаблона проектирования «Интерпретатор». [4]

На приведенной выше UML классов диаграмме Client класс относится к общему AbstractExpression интерфейс для интерпретации выражения interpret(context).
TerminalExpression Класс не имеет дочерних элементов и интерпретирует выражение напрямую.
NonTerminalExpression класс поддерживает контейнер дочерних выражений ( expressions) и пересылает запросы интерпретации этим expressions.

Диаграмма взаимодействия объектов показывает взаимодействие во время выполнения: Client объект отправляет запрос интерпретации в дерево абстрактного синтаксиса. Запрос пересылается (выполняется) всем объектам вниз по древовидной структуре.
The NonTerminalExpression объекты ( ntExpr1,ntExpr2) перенаправить запрос своим дочерним выражениям.
The TerminalExpression объекты ( tExpr1,tExpr2,…) выполнить интерпретацию напрямую.

Диаграмма классов UML

[ редактировать ]

Эта реализация C++11 основана на примере кода до C++98, приведенном в книге.

#include <iostream>
#include <map>
#include <cstring>

class Context;

class BooleanExp {
public:
  BooleanExp() = default;
  virtual ~BooleanExp() = default;
  virtual bool evaluate(Context&) = 0;
  virtual BooleanExp* replace(const char*, BooleanExp&) = 0;
  virtual BooleanExp* copy() const = 0;
};

class VariableExp;

class Context {
public:
  Context() :m() {}
  bool lookup(const VariableExp* key) { return m.at(key); }
  void assign(VariableExp* key, bool value) { m[key] = value; }
private:
  std::map<const VariableExp*, bool> m;
};

class VariableExp : public BooleanExp {
public:
  VariableExp(const char* name_) :name(nullptr) {
    name = strdup(name_);
  }
  virtual ~VariableExp() = default;
  virtual bool evaluate(Context& aContext) {
    return aContext.lookup(this);
  }
  virtual BooleanExp* replace( const char* name_, BooleanExp& exp ) {
    if (0 == strcmp(name_, name)) {
      return exp.copy();
    } else {
      return new VariableExp(name);
    }
  }
  virtual BooleanExp* copy() const {
    return new VariableExp(name);
  }
  VariableExp(const VariableExp&) = delete; // rule of three
  VariableExp& operator=(const VariableExp&) = delete;
private:
  char* name;
};

class AndExp : public BooleanExp {
public:
  AndExp(BooleanExp* op1, BooleanExp* op2)
    :operand1(nullptr), operand2(nullptr) {
    operand1 = op1;
    operand2 = op2;
  }
  virtual ~AndExp() = default;
  virtual bool evaluate(Context& aContext) {
    return operand1->evaluate(aContext) && operand2->evaluate(aContext);
  }
  virtual BooleanExp* replace(const char* name_, BooleanExp& exp) {
    return new AndExp(
        operand1->replace(name_, exp),
        operand2->replace(name_, exp)
      );
  }
  virtual BooleanExp* copy() const {
    return new AndExp(operand1->copy(), operand2->copy());
  }
  AndExp(const AndExp&) = delete; // rule of three
  AndExp& operator=(const AndExp&) = delete;
private:
  BooleanExp* operand1;
  BooleanExp* operand2;
};

int main() {
  BooleanExp* expression;
  Context context;
  VariableExp* x = new VariableExp("X");
  VariableExp* y = new VariableExp("Y");
  expression = new AndExp(x, y);

  context.assign(x, false);
  context.assign(y, true);
  bool result = expression->evaluate(context);
  std::cout << result << '\n';

  context.assign(x, true);
  context.assign(y, true);
  result = expression->evaluate(context);
  std::cout << result << '\n';
}

Вывод программы:

0
1

См. также

[ редактировать ]
  1. ^ Гамма, Эрих ; Хельм, Ричард ; Джонсон, Ральф; Влиссидес, Джон (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Аддисон-Уэсли. ISBN  0-201-63361-2 .
  2. ^ Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли. стр. 243 и далее . ISBN  0-201-63361-2 . {{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  3. ^ «Шаблон проектирования интерпретатора — проблема, решение и применимость» . w3sDesign.com . Проверено 12 августа 2017 г.
  4. ^ «Шаблон проектирования интерпретатора — структура и сотрудничество» . w3sDesign.com . Проверено 12 августа 2017 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a1a71e73f0ac6c3a879c563bb7d6606e__1711574160
URL1:https://arc.ask3.ru/arc/aa/a1/6e/a1a71e73f0ac6c3a879c563bb7d6606e.html
Заголовок, (Title) документа по адресу, URL1:
Interpreter pattern - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)