1
/*
2
  Copyright (c) 2006 Gábor Lehel <illissius@gmail.com>
3
4
  This library is free software; you can redistribute it and/or
5
  modify it under the terms of the GNU Library General Public
6
  License as published by the Free Software Foundation; either
7
  version 2 of the License, or (at your option) any later version.
8
9
  This library is distributed in the hope that it will be useful,
10
  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
  Library General Public License for more details.
13
14
  You should have received a copy of the GNU Library General Public License
15
  along with this library; see the file COPYING.LIB.  If not, write to
16
  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
  Boston, MA 02110-1301, USA.
18
*/
19
20
#ifndef AMAROK_EXPRESSION_H
21
#define AMAROK_EXPRESSION_H
22
23
#include <QList>
24
#include <QString>
25
26
struct expression_element
27
{
28
    QString field;
29
    QString text;
30
    bool negate: 1;
31
    enum { Contains, Less, More } match: 2;
32
    expression_element(): negate( false ), match( Contains ) { }
33
};
34
typedef QList<expression_element> or_list;
35
36
typedef QList<or_list> ParsedExpression;
37
38
class ExpressionParser
39
{
40
    public:
41
        ExpressionParser( const QString &expression );
42
        ParsedExpression parse();
43
        static ParsedExpression parse( const QString &expression );
44
45
        static bool isAdvancedExpression( const QString &expression );
46
47
    private:
48
        void parseChar(   const QChar &c );
49
        void handleSpace( const QChar &c );
50
        void handleMinus( const QChar &c );
51
        void handleColon( const QChar &c );
52
        void handleMod(   const QChar &c );
53
        void handleQuote( const QChar &c );
54
        void handleChar(  const QChar &c );
55
        void finishedToken();
56
        void finishedElement();
57
        void finishedOrGroup();
58
59
        const QString &m_expression;
60
        enum State { ExpectMinus, ExpectField, ExpectMod, ExpectText };
61
        int m_state;
62
        bool m_haveGroup;
63
        bool m_inQuote;
64
        bool m_inOrGroup;
65
        QString m_string;
66
        expression_element m_element;
67
        or_list m_or;
68
        ParsedExpression m_parsed;
69
};
70
71
72
#endif