]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/parser.h
Implement proper copy semantics
[libs/datafile.git] / source / parser.h
index 0989bd9d2d1fe378920c469c845f71435d799b28..d1879604b5fd8f566dd21829fbe042e7fcee3381 100644 (file)
@@ -2,20 +2,24 @@
 #define MSP_DATAFILE_PARSER_H_
 
 #include <string>
+#include <msp/core/noncopyable.h>
 #include "input.h"
 
 namespace Msp {
 namespace DataFile {
 
+class Loader;
+class LoaderAction;
 class ParserMode;
 class Statement;
+struct StatementKey;
 
 /**
 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
+class Parser: private NonCopyable
 {
 private:
        Input in;
@@ -28,18 +32,25 @@ 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.
-       */
+       /** 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 &);
+
        operator bool() const { return good && in; }
 };