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

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

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

Зміст

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

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

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

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

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

[ред.] Застосовність

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

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

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

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

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

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

[ред.] Джерела

  • Design Patterns: Elements of Reusable Object-Oriented Software
Іншими мовами