File: parser.hpp

package info (click to toggle)
openmw 0.49.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,992 kB
  • sloc: cpp: 372,479; xml: 2,149; sh: 1,403; python: 797; makefile: 26
file content (62 lines) | stat: -rw-r--r-- 1,313 bytes parent folder | download
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
#ifndef CSM_FILTER_PARSER_H
#define CSM_FILTER_PARSER_H

#include <memory>
#include <string>

namespace CSMFilter
{
    class Node;
}

namespace CSMWorld
{
    class Data;
}

namespace CSMFilter
{
    struct Token;

    class Parser
    {
        std::shared_ptr<Node> mFilter;
        std::string mInput;
        int mIndex;
        bool mError;
        const CSMWorld::Data& mData;

        Token getStringToken();

        Token getNumberToken();

        Token getNextToken();

        Token checkKeywords(const Token& token);
        ///< Turn string token into keyword token, if possible.

        std::shared_ptr<Node> parseImp(bool allowEmpty = false, bool ignoreOneShot = false);
        ///< Will return a null-pointer, if there is nothing more to parse.

        std::shared_ptr<Node> parseNAry(const Token& keyword);

        std::shared_ptr<Node> parseText();

        std::shared_ptr<Node> parseValue();

        void error();

    public:
        Parser(const CSMWorld::Data& data);

        bool parse(const std::string& filter, bool allowPredefined = true);
        ///< Discards any previous calls to parse
        ///
        /// \return Success?

        std::shared_ptr<Node> getFilter() const;
        ///< Throws an exception if the last call to parse did not return true.
    };
}

#endif