Interpreter
(Интерпретатор)
Small language
Для чего он нужен?
Общий вид
Регулярные выражения
expression ::= literal | alternation | sequence | repetition | '(' expression ')'
alternation ::= expression | expression
sequence ::= expression & expression
repetition ::= expression *
literal : := 'a' | 'b' | 'c' | . . . { 'a' | 'b' | 'c' | ... }*
raining & (dogs | cats) *
Использование паттерна
Логические выражения
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”
(true and x) or (у and (not x))
(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);
Замена
NotExp not_z = new NotExp(z) ;
BooleanExp replacement = expression.Replace("Y", not_z);
context.Assign(z, true);
result = replacement.Evaluate(context);
Отличие от паттерна “компоновщик”
Достоинства и недостатки
Достоинства:
Недостатки:
Взаимодействие с другими паттернами