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
|