09.04.2016 Views

Priemioop

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Паттерн Interpreter<br />

AndExp::AndExp (BooleanExp* opl , BooleanExp* op2 ) {<br />

_operandl = opl;<br />

_operand2 = op2;<br />

}<br />

При решении AndExp вычисляются его операнды и результат применения<br />

к ним операции логического И возвращается:<br />

bool AndExp::Evaluate (Context^ aContext) {<br />

return<br />

_operandl->Evaluate (aContext) &&<br />

_operand2->Evaluate (aContext) ;<br />

}<br />

В классе AndExp операции Copy и Replace реализованы с помощью рекурсивных<br />

обращений к операндам:<br />

BooleanExp* AndExp: : Copy () const {<br />

return<br />

new AndExp ( _operandl->Copy(), _operand2->Copy ( ) ) ;<br />

}<br />

BooleanExp* AndExp::Replace (const char* name, BooleanExpk exp) {<br />

return<br />

new AndExp(<br />

_operandl->Replace(name, exp),<br />

_operand2->Replace(name, exp)<br />

);<br />

}<br />

Определим теперь булево выражение<br />

(true and x) or (у and (not x))<br />

и вычислим его для некоторых конкретных значений булевых переменных х и у:<br />

BooleanExp* expression;<br />

Context context;<br />

VariableExp* x = new VariableExp("X");<br />

VariableExp* у = new VariableExp("Y");<br />

expression = new OrExpt<br />

new AndExp(new Constant(true),<br />

new AndExp(y, new NotExp(x))<br />

);<br />

x),<br />

context.Assign(x, false);<br />

context.Assign(y, true);<br />

bool result = expression->Evaluate(context);<br />

С такими значениями х и у выражение равно true. Чтобы вычислить его при<br />

других значениях переменных, достаточно просто изменить контекст.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!