Інтерпретатор (шаблон проектування)
Матеріал з Вікіпедії — вільної енциклопедії.
Інтерпретатор (англ. Interpreter) - шаблон проектування, відноситься до класу шаблонів поведінки.
Зміст |
[ред.] Призначення
Для заданої мови визначає представлення її граматики, а також інтерпретатор речень цієї мови.
[ред.] Мотивація
У разі, якщо якась задача виникає досить часто, має сенс подати її конкретні проявлення у вигляді речень простою мовою. Потім можна буде створити інтерпретатор, котрий вирішує задачу, аналізуючи речення цієї мови.
Наприклад, пошук рядків за зразком – досить розповсюджена задача. Регулярні вирази – це стандартна мова для завдавання зразків пошуку.
[ред.] Застосовність
Шаблон Інтерпретатор слід використовувати коли є мова для інтерпретації, речення котрої можна подати у вигляді абстрактних синтаксичних дерев. Краще за все шаблон працює коли:
- граматика проста. Для складних граматик ієрархія класів стає занадто громіздкою та некерованою. У таких випадках краще застосовувати генератори синтаксичних аналізаторів, оскільки вони можуть інтерпретувати вирази, не будуючи абстрактних синтаксичних дерев, що заощаджує пам'ять, а можливо і час;
- ефективність не є головним критерієм. Найбільш ефективні інтерпретатори зазвичай не працюють безпосередньо із деревами, а спочатку транслюють їх в іншу форму. Так, регулярний вираз часто перетворюють на кінцевий автомат. Але навіть у цьому разі сам транслятор можна реалізувати за допомогою шаблону інтерпретатор.
[ред.] Структура

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