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".