Шаблон переводчика
Эта статья нуждается в дополнительных цитатах для проверки . ( ноябрь 2008 г. ) |
В компьютерном программировании шаблон интерпретатора — это шаблон проектирования , который определяет, как оценивать предложения на языке. Основная идея состоит в том, чтобы иметь класс для каждого символа ( терминального или нетерминального ) на специализированном компьютерном языке . Синтаксическое дерево предложения на языке является экземпляром составного шаблона и используется для оценки (интерпретации) предложения для клиента. [1] : 243 См. также Составной шаблон .
Обзор
[ редактировать ]Переводчик [2] шаблон проектирования — один из двадцати трех известных Шаблоны проектирования GoF которые описывают, как решать повторяющиеся проблемы проектирования для разработки гибкого и многократно используемого объектно-ориентированного программного обеспечения, то есть объектов, которые легче реализовать, изменить, протестировать и повторно использовать.
Какие проблемы может решить шаблон проектирования «Интерпретатор»?
[ редактировать ]Источник: [3]
- Должна быть определена грамматика . для простого языка
- чтобы предложения на языке можно было интерпретировать.
Когда проблема возникает очень часто, ее можно представить в виде предложения на простом языке. ( Языки, специфичные для предметной области ), чтобы переводчик мог решить проблему интерпретируя предложение.
Например, когда необходимо указать много разных или сложных выражений поиска. Реализация (жесткое подключение) их непосредственно в класс негибкая. потому что он связывает класс с определенными выражениями и делает невозможным указание новых выражений или изменение существующих независимо от класса (без необходимости изменения).
Какое решение описывает шаблон проектирования «Интерпретатор»?
[ редактировать ]- Определите грамматику простого языка, определив
Expression
иерархия классов и реализацияinterpret()
операция. - Представляйте предложение на языке с помощью абстрактного синтаксического дерева (AST), состоящего из
Expression
экземпляры. - Интерпретируйте предложение, называя
interpret()
на АСТ.
Объекты выражений рекурсивно компонуются в составную/древовидную структуру, которая называется
абстрактное синтаксическое дерево (см. Составной шаблон ).
Шаблон Interpreter не описывает, как
построить абстрактное синтаксическое дерево. Это может
выполняться либо вручную клиентом, либо автоматически анализатором .
См. также диаграмму классов и объектов UML ниже.
Использование
[ редактировать ]- Специализированные языки запросов к базе данных, такие как SQL .
- Специализированные компьютерные языки, которые часто используются для описания протоколов связи.
- Большинство компьютерных языков общего назначения фактически включают в себя несколько специализированных языков. [ нужна ссылка ] .
Структура
[ редактировать ]Диаграмма классов и объектов UML
[ редактировать ]
На приведенной выше 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
См. также
[ редактировать ]- Форма Бэкуса – Наура
- Комбинаторная логика в вычислениях
- Шаблоны проектирования
- Язык, специфичный для предметной области
- Переводчик (компьютерный)
Ссылки
[ редактировать ]- ^ Гамма, Эрих ; Хельм, Ричард ; Джонсон, Ральф; Влиссидес, Джон (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Аддисон-Уэсли. ISBN 0-201-63361-2 .
- ^ Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Эддисон Уэсли. стр. 243 и далее . ISBN 0-201-63361-2 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ «Шаблон проектирования интерпретатора — проблема, решение и применимость» . w3sDesign.com . Проверено 12 августа 2017 г.
- ^ «Шаблон проектирования интерпретатора — структура и сотрудничество» . w3sDesign.com . Проверено 12 августа 2017 г.
Внешние ссылки
[ редактировать ]