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.

Паттерны поведения<br />

.alternation ::= expression 'Г expression<br />

sequence ::= expression '&' expression<br />

repetition ::= expression 'repeat'<br />

literal ::= 'a 1 | 'b' | 'c 1 | ... { 'a 1 I 'b 1 I 'c' I ... }*<br />

Между этой грамматикой и той, что приведена в разделе «Мотивация», есть<br />

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

в Smalltalk символ * не может быть постфиксной операцией. Поэтому<br />

вместо него мы употребляем слово repeat. Например, регулярное выражение<br />

(('dog ' | 'cat ') repeat & 'weather')<br />

соответствует входной строке 'dog dog cat weather'.<br />

Для реализации программы сопоставления мы определим пять классов, упомянутых<br />

на стр. 237. В классе SequenceExpression есть переменные экземпляра<br />

expression1 и expression2 для хранения ссылок на потомков в дереве.<br />

Класс AlternationExpression хранит альтернативы в переменных экземпляра<br />

alternativel и alternative2, а класс RepetitionExpression - повторяемое<br />

выражение в переменной экземпляра repetition. В классе LiteralExpression<br />

есть переменная экземпляра components для хранения списка объектов (скорее<br />

всего, символов), представляющих литеральную строку, которая должна соответствовать<br />

входной строке.<br />

Операция match: реализует интерпретатор регулярных выражений. В каждом<br />

из классов, входящих в абстрактное синтаксическое дерево, эта операция реализована.<br />

Ее аргументом является переменная inputState, описывающая текущее<br />

состояние процесса сопоставления, то есть уже прочитанную часть входной<br />

строки.<br />

Текущее состояние характеризуется множеством входных потоков, представляющим<br />

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

к настоящему моменту принять. (Это примерно то же, что регистрация всех состояний,<br />

в которых побывал бы эквивалентный конечный автомат, распознавший<br />

входной поток до данного места.)<br />

Текущее состояние наиболее важно для операции repeat. Например, регулярному<br />

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

1<br />

а' repeat<br />

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

1<br />

а' repeat & ' be '<br />

строки " abc", " aabc", " aaabc" и т.д. Но при наличии регулярного выражения<br />

'а' repeat & 'abc'<br />

сопоставление входной строки "aabc" с подвыражением " 'a' repeat" дало<br />

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

- двум. Из них лишь поток, принявший один символ, может быть сопоставлен<br />

с остатком строки " abc".

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

Saved successfully!

Ooh no, something went wrong!