09.04.2016 Views

Priemioop

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

Теперь рассмотрим определения match: для каждого класса, описывающего<br />

регулярное выражение. SequenceExpression производит сопоставление с каждым<br />

подвыражением в определенной последовательности. Обычно потоки ввода<br />

не входят в его состояние input State.<br />

match: inputState<br />

^ expression2 match:<br />

(expressionl match: inputState).<br />

AlternationExpression возвращает результат, объединяющий состояния<br />

всех альтернатив. Вот определение match: для этого случая:<br />

match: inputState<br />

| finalState |<br />

finalState := alternative1 match: inputState.<br />

finalState addAll: (alternative2 match: inputState).<br />

^ finalState<br />

Операция match: для RepetitionExpression пытается найти максимальное<br />

количество состояний, допускающих сопоставление:<br />

match: inputState<br />

| aState finalState |<br />

aState := inputState.<br />

finalState := inputState copy.<br />

[aState isEmpty]<br />

whileFalse:<br />

[aState := repetition match: aState.<br />

finalState addAll: aState].<br />

^ finalState<br />

На выходе этой операции мы обычно получаем больше состояний, чем на входе,<br />

поскольку RepetitionExpression может быть сопоставлено с одним, двумя<br />

или более вхождениями повторяющегося выражения во входную строку. В выходном<br />

состоянии представлены все возможные варианты, а решение о том, какое<br />

из состояний правильно, принимается последующими элементами регулярного<br />

выражения.<br />

Наконец, операция match: для LiteralExpression сравнивает свои компоненты<br />

с каждым возможным входным потоком и оставляет только те из них,<br />

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

match: inputState<br />

I finalState tStream I<br />

finalState := Set new.<br />

inputState<br />

do:<br />

[:stream I tStream := stream copy.<br />

(tStream nextAvailable:<br />

components size<br />

) = components<br />

ifTrue: [finalState add: tStream]<br />

].<br />

^ finalState

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

Saved successfully!

Ooh no, something went wrong!