1 of 16

Interpreter

(Интерпретатор)

Small language

2 of 16

3 of 16

Для чего он нужен?

  • проблема часто встречается
  • может быть описана простой грамматикой или набором правил
  • решает проблемы

4 of 16

Общий вид

5 of 16

Регулярные выражения

expression ::= literal | alternation | sequence | repetition | '(' expression ')'

alternation ::= expression | expression

sequence ::= expression & expression

repetition ::= expression *

literal : := 'a' | 'b' | 'c' | . . . { 'a' | 'b' | 'c' | ... }*

6 of 16

7 of 16

raining & (dogs | cats) *

8 of 16

Использование паттерна

  • Определить “малый“ язык
  • Разработать грамматику для языка
  • Для каждого грамматического правила создать свой класс
  • Полученный набор классов организовать в структуру (компоновщик)
  • В полученной иерархии классов определить метод interpret(Context)

9 of 16

Логические выражения

BooleanExp ::= VariableExp | Constant | OrExp | AndExp | NotExp | “(“ BooleanExp “)”

AndExp ::= BooleanExp 'and' BooleanExp

OrExp : : = BooleanExp ' or ' BooleanExp

NotExp ::= 'not' BooleanExp

Constant ::= “true” | “false”

VariableExp ::= “A” | “B” | ... |”X'”| “Y” | “Z”

10 of 16

(true and x) or (у and (not x))

11 of 16

(true and x) or (у and (not x))

BooleanExp expression;

Context context = new Context();

VariableExp x = new VariableExp("X");

VariableExp y = new VariableExp("Y");

expression = new OrExp(

new AndExp(new Constant(true), x),

new AndExp(y, new NotExp(x))

);

context.Assign(x, false);

context.Assign(y, true);

boolean result = expression.Evaluate(context);

12 of 16

Замена

NotExp not_z = new NotExp(z) ;

BooleanExp replacement = expression.Replace("Y", not_z);

context.Assign(z, true);

result = replacement.Evaluate(context);

13 of 16

Отличие от паттерна “компоновщик

  • Создание абстрактного синтаксического дерева
  • Определение операции Interpret
  • Разделение терминальных символов с помощью паттерна приспособленец

14 of 16

Достоинства и недостатки

Достоинства:

  • Грамматику легко изменять и расширять
  • Простая реализация грамматики

Недостатки:

  • Сложные грамматики трудно сопровождать
  • Добавление новых способов интерпретации выражений

15 of 16

Взаимодействие с другими паттернами

  • Абстрактное синтаксическое дерево интерпретатора – пример паттерна Компоновщик
  • Для обхода узлов дерева может применяться паттерн Итератор
  • Терминальные символы могут разделяться c помощью Приспособленец

16 of 16

  • часто встречающаяся, изменяющаяся задача
  • “инвестиции” в малый язык оправданы