1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
//
// QueryParser.cc
//
// QueryParser: (abstract) root of the family of classes that create
// Query trees by analyzing query strings.
// The main public interface consists on Parse(),
// which does the job.
// The subclasses must provide a lexer.
// This class implements also the common behaviour needed to
// parse single words and phrases.
//
// Part of the ht://Dig package <http://www.htdig.org/>
// Copyright (c) 1995-2004 The ht://Dig Group
// For copyright details, see the file COPYING in your distribution
// or the GNU Library General Public License (LGPL) version 2 or later
// <http://www.gnu.org/copyleft/lgpl.html>
//
// $Id: QueryParser.cc,v 1.4 2004/05/28 13:15:24 lha Exp $
//
#include "QueryParser.h"
#include "Query.h"
#include "htString.h"
#include "ExactWordQuery.h"
#include "PhraseQuery.h"
#include "FuzzyExpander.h"
extern int debug;
FuzzyExpander *
QueryParser::expander = 0;
//
// parse a query string
//
//
Query *
QueryParser::Parse(const String &query_string)
{
error = "";
Token().Set(query_string);
Query *result = ParseExpression();
if(result && !Token().IsEnd())
{
Expected("end of query");
// delete result;
result = 0;
}
return result;
}
// parse one word
// return a fuzzy word query
//
Query *
QueryParser::ParseWord()
{
Query *result = 0;
if(expander)
{
result = expander->MakeQuery(Token().Value());
}
else
{
result = new ExactWordQuery(Token().Value());
}
Token().Next();
return result;
}
//
// parse one word
// return an exact query
//
Query *
QueryParser::ParseExactWord()
{
Query *result = new ExactWordQuery(Token().Value());
Token().Next();
return result;
}
//
// phrase == word { word }
//
Query *
QueryParser::ParsePhrase()
{
Query *result = 0;
Query *word = 0;
if(!Token().IsEnd() && !Token().IsQuote())
{
word = ParseExactWord();
}
if(word)
{
result = new PhraseQuery;
result->Add(word);
while(word && !Token().IsEnd() && !Token().IsQuote())
{
word = ParseExactWord();
if(word)
{
result->Add(word);
}
}
}
if(!word && result)
{
delete result;
result = 0;
}
if(!result)
{
Expected("at least one word after \"");
}
return result;
}
void
QueryParser::Expected(const String &what)
{
error << "Expected " << what;
if(Token().IsEnd())
{
error << " at the end";
}
else
{
error << " instead of '" << Token().Value() << "'";
}
}
|