diff options
Diffstat (limited to 'dep/g3dlite/include/G3D/TextInput.h')
-rw-r--r-- | dep/g3dlite/include/G3D/TextInput.h | 77 |
1 files changed, 59 insertions, 18 deletions
diff --git a/dep/g3dlite/include/G3D/TextInput.h b/dep/g3dlite/include/G3D/TextInput.h index 7aefb50ffa8..47cbe8c91f7 100644 --- a/dep/g3dlite/include/G3D/TextInput.h +++ b/dep/g3dlite/include/G3D/TextInput.h @@ -1,16 +1,16 @@ /** - @file TextInput.h + \file G3D/TextInput.h Simple text lexer/tokenizer. - @maintainer Morgan McGuire, http://graphics.cs.williams.edu + \maintainer Morgan McGuire, http://graphics.cs.williams.edu - @cite Based on a lexer written by Aaron Orenstein. + \cite Based on a lexer written by Aaron Orenstein. - @created 2002-11-27 - @edited 2010-07-03 + \created 2002-11-27 + \edited 2013-03-25 - Copyright 2000-2010, Morgan McGuire. + Copyright 2000-2013, Morgan McGuire. All rights reserved. */ @@ -148,7 +148,9 @@ public: /** - A simple style tokenizer for reading text files. TextInput handles a + \brief A simple tokenizer for parsing text files. + + TextInput handles a superset of C++,Java, Matlab, and Bash code text including single line comments, block comments, quoted strings with escape sequences, and operators. TextInput recognizes several categories of tokens, @@ -191,7 +193,7 @@ public: <B>Examples</B> - <PRE> + \code TextInput ti(TextInput::FROM_STRING, "name = \"Max\", height = 6"); Token t; @@ -206,15 +208,15 @@ public: std::string name = ti.read().sval; ti.read(); - </PRE> + \endcode - <PRE> + \code TextInput ti(TextInput::FROM_STRING, "name = \"Max\", height = 6"); ti.readSymbols("name", "="); std::string name = ti.readString(); ti.readSymbols(",", "height", "="); double height = ti. readNumber(); - </PRE> + \endcode Assumes that the file is not modified once opened. */ @@ -329,14 +331,15 @@ public: int startingLineNumberOffset; /** - Parse -1.#IND00 as the floating point number returned by - nan(), -1.#INF00 as -G3D::inf(), and 1.#INF00 as G3D::inf(). - + Parse "-1.#IND00" as the floating point number returned by + G3D::nan(), "-1.#INF00" as - G3D::inf(), and "1.#INF00" as G3D::inf(). + Note that the C99 standard specifies that a variety of formats like "nan" are to be used; these are supported by G3D::TextInput::Settings::simpleFloatSpecials. An alternative to specifying msvcFloatSpecials is to read numbers as: + \htmlonly <pre> Token x = t.read(); Token y = t.peek(); @@ -349,6 +352,7 @@ public: } // ... similar cases for inf </pre> + \endhtmlonly If the single-comment character was #, the floating point special format overrides the comment and will be parsed @@ -398,9 +402,12 @@ public: Settings(); }; - + private: + /** \sa pushSettings / popSettings */ + Array<Settings> settingsStack; + std::deque<Token> stack; /** @@ -477,7 +484,7 @@ private: Read the next token, returning an END token if no more input is available. */ - Token nextToken(); + void nextToken(Token& t); /** Helper for nextToken. Appends characters to t._string until the end @@ -488,6 +495,8 @@ private: */ void parseQuotedString(unsigned char delimiter, Token& t); + void initFromString(const char* str, int len, const Settings& settings); + public: class TokenException : public ParseError { @@ -569,9 +578,25 @@ public: */ TextInput(FS fs, const std::string& str, const Settings& settings = Settings()); + /** Creates input directly from a fixed-length, non-NULL terminated string. The first argument must be + TextInput::FROM_STRING. + */ + TextInput(FS fs, const char* str, size_t strLen, const Settings& settings = Settings()); + /** Returns true while there are tokens remaining. */ bool hasMore(); + /** Temporarily switch parsing to use \a settings. Note that this will override the currently recorded sourceFilename unless you explicitly set it back. + \sa popSettings */ + void pushSettings(const Settings& settings) { + settingsStack.push(options); + options = settings; + } + + void popSettings() { + options = settingsStack.pop(); + } + /** Read the next token (which will be the END token if ! hasMore()). Signed numbers can be handled in one of two modes. If the option @@ -589,10 +614,13 @@ public: */ Token read(); + /** Avoids the copy of read() */ + void read(Token& t); + /** Calls read() until the result is not a newline or comment */ Token readSignificant(); - /** Read one token (or possibly two) as a number or throws + /** Read one token (or possibly two, for minus sign) as a number or throws WrongTokenType, and returns the number. If the first token in the input is a number, it is returned directly. @@ -608,6 +636,10 @@ public: */ double readNumber(); + /** Reads a number that must be in C integer format: + <code> [ '+' | '-' ] #+ | '0x'#+</code> */ + int readInteger(); + bool readBoolean(); /** Reads a string token or throws WrongTokenType, and returns the token. @@ -643,7 +675,7 @@ public: input stream is a string but does not match the @p s parameter. When an exception is thrown, no tokens are consumed. - \sa readString(), readStringToken(), readUntilNewlineAsString() + \sa readString(), readStringToken(), readUntilNewlineAsString(), readUntilDelimiterAsString() */ void readString(const std::string& s); @@ -653,6 +685,12 @@ public: end of file token (if they are enabled for parsing).*/ std::string readUntilNewlineAsString(); + /** Read from the beginning of the next token until the following delimiter character + and return the result as a string, ignoring all parsing in between. The delimiter + is not returned in the string, and the following token read will begin at the delimiter or + end of file token (if they are enabled for parsing).*/ + std::string readUntilDelimiterAsString(const char delimiter1, const char delimiter2 = '\0'); + /** Reads a comment token or throws WrongTokenType, and returns the token. Use this method (rather than readComment) if you want the token's @@ -734,6 +772,9 @@ public: */ Token readSymbolToken(); + /** Avoids the copy of readSymbolToken() */ + void readSymbolToken(Token& t); + /** Like readSymbolToken, but returns the token's string. Use this method (rather than readSymbolToken) if you want the token's |