Программирование >>  Инициализация объектов класса, структура 

1 ... 278 279 280 [ 281 ] 282 283 284 ... 395


==> ! daddy

daddy ( 3 ) lines match ! daddy ( 3 ) lines match

Requested query: ! daddy

( 2 ) when the wind blows through her hair, it looks almost alive, ( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 5 ) she tells him, at the same time wanting him to tell her more.

запрос ИЛИ , формулируемый с помощью оператора . Выводятся все строки, в которых встречается хотя бы одно из двух указанных слов:

==> fiery untamed

fiery ( 1 ) lines match untamed ( 1 ) lines match fiery untamed ( 2 ) lines match

Requested query: fiery untamed

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her,

( 4 ) magical but untamed. Daddy, shush, there is no such thing,

запрос И , формулируемый с помощью оператора &&. Выводятся все строки, где оба указанных слова встречаются, причем располагаются рядом. Сюда входит и случай, когда одно слово является последним в строке, а другое - первым в следующей:

==> untamed && Daddy

untamed ( 1 ) lines match

daddy ( 3 ) lines match

untamed && daddy ( 1 ) lines match

Requested query: untamed && daddy

( 4 ) magical but untamed. Daddy, shush, there is no such thing,

Эти элементы можно комбинировать:

fiery && bird shyly

Однако обработка производится слева направо, и все элементы имеют одинаковые приоритеты. Поэтому наш составной запрос интерпретируется как fiery bird ИЛИ shyly, а не как fiery bird ИЛИ fiery shyly:

==> fiery && bird shyly

fiery ( 1 ) lines match bird ( 1 ) lines match fiery && bird ( 1 ) lines match shyly ( 1 ) lines match

fiery && bird shyly ( 2 ) lines match

запрос НЕ , формулируемтй с помощью оператора !. Выводятся все строки, где не встречается указанное слово. Например, так формулируется отрицание запроса 1:



Requested query: fiery && bird shyly

( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 6 ) Shyly, she asks, I mean, Daddy, is there?

Чтобы можно было группировать части запроса, наша система должна поддерживать скобки. Например:

Pfiery && (bird shyly)

выдает все вхождения fiery bird или fiery shyly1. результат исполнения этого запроса приведен в начале данного раздела. Кроме того, система не должна многократно отображать одну и ту же строку.

17.1. Определение иерархии классов

В этой главе мы построим иерархию классов для представления запроса пользователя.

NameQuery Shakespeare NotQuery ! Shakespeare

OrQuery Shakespeare Marlowe

Сначала реализуем каждую операцию в виде отдельного класса:

AndQuery William && Shakespeare

В каждом классе определим функцию-член eval() , которая выполняет соответствующую операцию. К примеру, для NameQuery она возвращает вектор позиций, содержащий координате! (номера строки и колонки) начала каждого вхождения слова (см. раздел 6.8); для OrQuery строит объединение векторов позиций обоих своих операндов и т. д.

Таким образом, запрос

i untamed fiery

Примечание [O.A.5]: Нумера ция сносок сбита.

состоит из объекта класса OrQuery, который содержит два объекта NameQuery в качестве операндов. Для простых запросов этого достаточно, но при обработке составных запросов типа

Alice && Weeks

1 Напомним, что для упрощения реализации необходимо, чтобы между любыми двумя словами, включая скобки и операторы запроса, был пробел. В реальной системе такое требование вряд ли разумно, но мы полагаем, что для вводного курсе, каковым является наша книга, это вполне приемлемо.



AndQuery

OrQuery

NameQuery ( Alice ) NameQuery ( Emma )

( Emma )

AndQuery. Правым операндом AndQuery является объект NameQuery для слова Weeks.

Nameery ( Weeks )

Но левый операнд - это объект OrQuery, предшествующий оператору &&. На его месте мог бы быть объект NotQuery или другой объект AndQuery. Как же следует представить операнд, если он может принадлежать к типу любого из четырех классов? Эта проблема имеет две стороны:

необходимо уметь объявлять тип операнда в классах OrQuery, AndQuery и NotQuery так, чтобы с его помощью можно было представить тип любого из четырех классов запросов;

какое бы решение мы ни выбрали в предыдущем случае, мы должны иметь возможность вызывать соответствующий классу каждого операнда вариант функции-члена eval() .

Решение, не согласующееся с объектной ориентированностью, состоит в том, чтобы определить тип операнда как объединение и включить дискриминант, показывающий

не объектно-ориентированное решение union op type {

объединение не может содержать объекты классов с ассоциированн конструкторами NotQuery *nq; OrQuery *oq; AndQuery *aq; string *word;

enum opTypes { Not query=1,

O query, And query, Name query

class AndQuery { public:

...

private:

* opTypes хранит информацию о фактических типах операндов запроса

* op type - это сами операнды

это сами операнды

op type lop, rop; opTypes lop type,

rop type;

текущий тип операнда:

Хранить указатели на объекта: можно и с помощью типа void*:

возникает проблема. Данный запрос состоит из двух подзапросов: объекта OrQuery, содержащего объекты NameQuery для представления слов Alice и Emima, и объекта



1 ... 278 279 280 [ 281 ] 282 283 284 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика