summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htsearch/QueryParser.cc
blob: ad74b8ba7f4cc5c2f34bad00081fcc7ec028a635 (plain)
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() << "'";
	}
}