Інтерпретатор (шаблон проєктування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Інтерпретатор (англ. Interpreter) — шаблон проєктування, належить до класу шаблонів поведінки.

Призначення[ред. | ред. код]

Для заданої мови визначає представлення її граматики, а також інтерпретатор речень цієї мови.

Мотивація[ред. | ред. код]

У разі, якщо якась задача виникає досить часто, є сенс подати її конкретні проявлення у вигляді речень простою мовою. Потім можна буде створити інтерпретатор, котрий вирішує задачу, аналізуючи речення цієї мови.

Наприклад, пошук рядків за зразком — досить розповсюджена задача. Регулярні вирази — це стандартна мова для задання зразків пошуку.

Застосування[ред. | ред. код]

Шаблон Інтерпретатор слід використовувати, коли є мова для інтерпретації, речення котрої можна подати у вигляді абстрактних синтаксичних дерев. Найкраще шаблон працює коли:

  • граматика проста. Для складних граматик ієрархія класів стає занадто громіздкою та некерованою. У таких випадках краще застосовувати генератори синтаксичних аналізаторів, оскільки вони можуть інтерпретувати вирази, не будуючи абстрактних синтаксичних дерев, що заощаджує пам'ять, а можливо і час;
  • ефективність не є головним критерієм. Найефективніші інтерпретатори зазвичай не працюють безпосередньо із деревами, а спочатку транслюють їх в іншу форму. Так, регулярний вираз часто перетворюють на скінченний автомат. Але навіть у цьому разі сам транслятор можна реалізувати за допомогою шаблону інтерпретатор.

Структура[ред. | ред. код]

UML діаграма, що описує структуру шаблону проєктування Інтепретатор
  • AbstractExpression — абстрактний вираз:
    • оголошує абстрактну операцію Interpret, загальну для усіх вузлів у абстрактному синтаксичному дереві;
  • TerminalExpression — термінальний вираз:
    • реалізує операцію Interpret для термінальних символів граматики;
    • необхідний окремий екземпляр для кожного термінального символу у реченні;
  • NonterminalExpression — нетермінальний вираз:
    • по одному такому класу потребується для кожного граматичного правила;
    • зберігає змінні екземпляру типу AbstractExpression для кожного символу;
    • реалізує операцію Interpret для нетермінальних символів граматики. Ця операція рекурсивно викликає себе для змінних, зберігаючих символи;
  • Contextконтекст:
    • містить інформацію, глобальну по відношенню до інтерпретатору;
  • Client — клієнт:
    • будує (або отримує у готовому вигляді) абстрактне синтаксичне дерево, репрезентуюче окреме речення мовою з даною граматикою. Дерево складено з екземплярів класів NonterminalExpression та TerminalExpression;
    • викликає операцію Interpret.

Відносини[ред. | ред. код]

  • клієнт будує (або отримує у готовому вигляді) речення у вигляді абстрактного синтаксичного дерева, у вузлах котрого знаходяться об'єкти класів NonterminalExpression та TerminalExpression. Далі клієнт ініціалізує контекст та викликає операцію Interpret;
  • у кожному вузлі виду NonterminalExpression через операції Interpret визначається операція Interpret для кожного підвиразу. Для класу TerminalExpression операція Interpret визначає базу рекурсії;
  • операції Interpret у кожному вузлі використовують контекст для зберігання та доступу до стану інтерпретатора.

Переваги[ред. | ред. код]

  • Граматику стає легко розширювати і змінювати, реалізації класів, що описують вузли абстрактного синтаксичного дерева схожі (легко кодуються). Можна легко змінювати спосіб обчислення виразів.

Недоліки[ред. | ред. код]

  • Супровід граматики з великим числом правил важко.
  • Рідко використовується, через свою специфіку

Реалізація[ред. | ред. код]

C++[ред. | ред. код]

C#[ред. | ред. код]

Джерела[ред. | ред. код]

Література[ред. | ред. код]

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.