| #ifndef CPPTL_JSON_READER_H_INCLUDED | |
| # define CPPTL_JSON_READER_H_INCLUDED | |
| # include "forwards.h" | |
| # include "value.h" | |
| # include <deque> | |
| # include <stack> | |
| # include <string> | |
| namespace Json { | |
| class Value; | |
| /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value. | |
| * | |
| * | |
| */ | |
| class JSON_API Reader | |
| { | |
| public: | |
| typedef char Char; | |
| typedef const Char *Location; | |
| Reader(); | |
| /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. | |
| * \param document UTF-8 encoded string containing the document to read. | |
| * \param root [out] Contains the root value of the document if it was | |
| * successfully parsed. | |
| * \param collectComments \c true to collect comment and allow writing them back during | |
| * serialization, \c false to discard comments. | |
| * \return \c true if the document was successfully parsed, \c false if an error occurred. | |
| */ | |
| bool parse( const std::string &document, | |
| Value &root, | |
| bool collectComments = true ); | |
| /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. | |
| * \param document UTF-8 encoded string containing the document to read. | |
| * \param root [out] Contains the root value of the document if it was | |
| * successfully parsed. | |
| * \param collectComments \c true to collect comment and allow writing them back during | |
| * serialization, \c false to discard comments. | |
| * \return \c true if the document was successfully parsed, \c false if an error occurred. | |
| */ | |
| bool parse( const char *beginDoc, const char *endDoc, | |
| Value &root, | |
| bool collectComments = true ); | |
| /** \brief Returns a user friendly string that list errors in the parsed document. | |
| * \return Formatted error message with the list of errors with their location in | |
| * the parsed document. An empty string is returned if no error occurred | |
| * during parsing. | |
| */ | |
| std::string getFormatedErrorMessages() const; | |
| private: | |
| enum TokenType | |
| { | |
| tokenEndOfStream = 0, | |
| tokenObjectBegin, | |
| tokenObjectEnd, | |
| tokenArrayBegin, | |
| tokenArrayEnd, | |
| tokenString, | |
| tokenNumber, | |
| tokenTrue, | |
| tokenFalse, | |
| tokenNull, | |
| tokenArraySeparator, | |
| tokenMemberSeparator, | |
| tokenComment, | |
| tokenError | |
| }; | |
| class Token | |
| { | |
| public: | |
| TokenType type_; | |
| Location start_; | |
| Location end_; | |
| }; | |
| class ErrorInfo | |
| { | |
| public: | |
| Token token_; | |
| std::string message_; | |
| Location extra_; | |
| }; | |
| typedef std::deque<ErrorInfo> Errors; | |
| bool expectToken( TokenType type, Token &token, const char *message ); | |
| bool readToken( Token &token ); | |
| void skipSpaces(); | |
| bool match( Location pattern, | |
| int patternLength ); | |
| bool readComment(); | |
| bool readCStyleComment(); | |
| bool readCppStyleComment(); | |
| bool readString(); | |
| void readNumber(); | |
| bool readValue(); | |
| bool readObject( Token &token ); | |
| bool readArray( Token &token ); | |
| bool decodeNumber( Token &token ); | |
| bool decodeString( Token &token ); | |
| bool decodeString( Token &token, std::string &decoded ); | |
| bool decodeDouble( Token &token ); | |
| bool decodeUnicodeEscapeSequence( Token &token, | |
| Location ¤t, | |
| Location end, | |
| unsigned int &unicode ); | |
| bool addError( const std::string &message, | |
| Token &token, | |
| Location extra = 0 ); | |
| bool recoverFromError( TokenType skipUntilToken ); | |
| bool addErrorAndRecover( const std::string &message, | |
| Token &token, | |
| TokenType skipUntilToken ); | |
| void skipUntilSpace(); | |
| Value ¤tValue(); | |
| Char getNextChar(); | |
| void getLocationLineAndColumn( Location location, | |
| int &line, | |
| int &column ) const; | |
| std::string getLocationLineAndColumn( Location location ) const; | |
| void addComment( Location begin, | |
| Location end, | |
| CommentPlacement placement ); | |
| void skipCommentTokens( Token &token ); | |
| typedef std::stack<Value *> Nodes; | |
| Nodes nodes_; | |
| Errors errors_; | |
| std::string document_; | |
| Location begin_; | |
| Location end_; | |
| Location current_; | |
| Location lastValueEnd_; | |
| Value *lastValue_; | |
| std::string commentsBefore_; | |
| bool collectComments_; | |
| }; | |
| } // namespace Json | |
| #endif // CPPTL_JSON_READER_H_INCLUDED |