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

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

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

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

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

Структура

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

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

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

Реалізація

C++

C#

Джерела

Interpreter Interpreter Design Pattern