С++ для начинающих


         

Определение класса UserQuery - часть 3


           _current_op.push( pq );

}

inline void

UserQuery::

evalOr()

{

           Query *pop = _query_stack.top(); _query_stack.pop();

           OrQuery *pq = new OrQuery( pop );

           if ( _lparenOn )

        { pq->lparen( _lparenOn ); _lparenOn = 0; }

           if ( _rparenOn )

        { pq->rparen( _rparenOn ); _rparenOn = 0; }

           _current_op.push( pq );

}

Операция evalNot() работает следующим образом. В хипе создается новый объект класса NotQuery, которому передаются счетчики левых и правых скобок для правильного отображения содержимого. Затем неполный оператор помещается в стек _current_op:

inline void

UserQuery::

evalNot()

{

           NotQuery *pq = new NotQuery;

          

           if ( _lparenOn )

        { pq->lparen( _lparenOn ); _lparenOn = 0; }

           if ( _rparenOn )

        { pq->rparen( _rparenOn ); _rparenOn = 0; }

           _current_op.push( pq );

}

При обнаружении закрывающей скобки вызывается операция evalRParen(). Если число активных левых скобок больше числа элементов в стеке _current_op, то ничего не происходит. В противном случае выполняются следующие действия. Из стека _query_stack извлекается текущий еще не присоединенный к оператору операнд, а из стека _current_op – текущий неполный оператор. Вызывается виртуальная функция add_op() класса Query, которая их объединяет. И наконец полный оператор помещается в стек _query_stack:

inline void

UserQuery::

evalRParen()

{

           if ( _paren < _current_op.size() )

           {

                  Query *poperand = _query_stack.top();

           _query_stack.pop();

                  Query *pop = _current_op.top();

           _current_op.pop();

                  pop->add_op( poperand );

                  _query_stack.push( pop );

           }

}

Операция evalWord() выполняет следующие действия. Она ищет указанное слово в отображении _word_map взятых из файла слов на векторы позиций. Если слово найдено, берется его вектор позиций и в хипе посредством конструктора с двумя параметрами создается новый объект NameQuery. В противном случае объект порождается с помощью конструктора с одним параметром. Если число элементов в стеке _current_op меньше либо равно числу встреченных ранее скобок, то нет неполного оператора, ожидающего операнда типа NameQuery, поэтому новый объект помещается в стек _query_stack. Иначе из стека _current_op извлекается неполный оператор, к которому с помощью виртуальной функции add_op() присоединяется операнд NameQuery, после чего ставший полным оператор помещается в стек _query_stack:




Содержание  Назад  Вперед