X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fparser.h;h=1437190b606b89640afabd4619a62c4fe21f65c8;hb=HEAD;hp=e127c5b3653fbfd02e77bbec7c344e5061ed113e;hpb=8ff59df1f2e603557eceacbc81a8dc44de051dae;p=libs%2Fdatafile.git diff --git a/source/parser.h b/source/parser.h index e127c5b..ed7a037 100644 --- a/source/parser.h +++ b/source/parser.h @@ -1,40 +1,57 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ #ifndef MSP_DATAFILE_PARSER_H_ #define MSP_DATAFILE_PARSER_H_ -#include #include +#include #include "input.h" namespace Msp { namespace DataFile { -class Statement; -struct Token; +class Loader; +class LoaderAction; +class ParserMode; +struct Statement; +struct StatementKey; -class Parser +/** +Frontend for loading datafiles. Handles switching between text and binary +formats. A Parser evaluates into a boolean value indicating whether more +statements may be read. +*/ +class Parser: private NonCopyable { -public: - Parser(std::istream &, const std::string &); - Statement parse(); - operator bool() const { return in; } private: - Input in; + Input in; + std::string main_src; std::string src; - bool good; - - Statement parse_(const Token *); - Token parse_token(); - bool is_delimiter(int); - bool isodigit(int); - std::string unescape_string(const std::string &); - std::string get_location(); - void parse_error(int, int); + bool good = true; + ParserMode *mode = nullptr; + +public: + Parser(IO::Base &i, const std::string &s); + ~Parser(); + + /** Reads a statement from the input. If the end of input was reached, an + empty invalid statement will be returned. If an error occurs, the parser + will be marked as bad and no more statements may be read, even if the + exception was caught. */ + Statement parse(bool raw = false); + +private: + void process_control_statement(const Statement &); + +public: + /** Returns a key for the next statement, consisting of its keyword and + signature. Not supported in all modes. */ + const StatementKey *peek(unsigned); + + /** Parses a statement and feeds its arguments to an action. The action + must be appropriate for the statement. Use peek() to determine the + statement's signature. */ + bool parse_and_load(unsigned, Loader &, const LoaderAction &); + + explicit operator bool() const { return good && in; } }; } // namespace DataFile