123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- #ifndef BASE_JSON_JSON_PARSER_H_
- #define BASE_JSON_JSON_PARSER_H_
- #include <stddef.h>
- #include <stdint.h>
- #include <memory>
- #include <string>
- #include "base/base_export.h"
- #include "base/compiler_specific.h"
- #include "base/gtest_prod_util.h"
- #include "base/json/json_common.h"
- #include "base/macros.h"
- #include "base/optional.h"
- #include "base/strings/string_piece.h"
- #include "base/values.h"
- namespace base {
- class Value;
- namespace internal {
- class JSONParserTest;
- class BASE_EXPORT JSONParser {
- public:
-
- enum JsonParseError {
- JSON_NO_ERROR = base::ValueDeserializer::kErrorCodeNoError,
- JSON_SYNTAX_ERROR = base::ValueDeserializer::kErrorCodeInvalidFormat,
- JSON_INVALID_ESCAPE,
- JSON_UNEXPECTED_TOKEN,
- JSON_TRAILING_COMMA,
- JSON_TOO_MUCH_NESTING,
- JSON_UNEXPECTED_DATA_AFTER_ROOT,
- JSON_UNSUPPORTED_ENCODING,
- JSON_UNQUOTED_DICTIONARY_KEY,
- JSON_TOO_LARGE,
- JSON_UNREPRESENTABLE_NUMBER,
- JSON_PARSE_ERROR_COUNT
- };
-
- static const char kSyntaxError[];
- static const char kInvalidEscape[];
- static const char kUnexpectedToken[];
- static const char kTrailingComma[];
- static const char kTooMuchNesting[];
- static const char kUnexpectedDataAfterRoot[];
- static const char kUnsupportedEncoding[];
- static const char kUnquotedDictionaryKey[];
- static const char kInputTooLarge[];
- static const char kUnrepresentableNumber[];
- explicit JSONParser(int options, size_t max_depth = kAbsoluteMaxDepth);
- ~JSONParser();
-
-
-
-
- Optional<Value> Parse(StringPiece input);
-
- JsonParseError error_code() const;
-
- std::string GetErrorMessage() const;
-
-
- int error_line() const;
-
-
- int error_column() const;
- private:
- enum Token {
- T_OBJECT_BEGIN,
- T_OBJECT_END,
- T_ARRAY_BEGIN,
- T_ARRAY_END,
- T_STRING,
- T_NUMBER,
- T_BOOL_TRUE,
- T_BOOL_FALSE,
- T_NULL,
- T_LIST_SEPARATOR,
- T_OBJECT_PAIR_SEPARATOR,
- T_END_OF_INPUT,
- T_INVALID_TOKEN,
- };
-
-
-
-
-
- class StringBuilder {
- public:
-
- StringBuilder();
-
- explicit StringBuilder(const char* pos);
- ~StringBuilder();
- StringBuilder& operator=(StringBuilder&& other);
-
-
-
- void Append(uint32_t point);
-
-
-
- void Convert();
-
-
-
- std::string DestructiveAsString();
- private:
-
- const char* pos_;
-
- size_t length_;
-
-
- base::Optional<std::string> string_;
- };
-
-
- Optional<StringPiece> PeekChars(size_t count);
-
- Optional<char> PeekChar();
-
-
- Optional<StringPiece> ConsumeChars(size_t count);
-
- Optional<char> ConsumeChar();
-
- const char* pos();
-
-
- Token GetNextToken();
-
-
- void EatWhitespaceAndComments();
-
-
- bool EatComment();
-
- Optional<Value> ParseNextToken();
-
-
- Optional<Value> ParseToken(Token token);
-
-
- Optional<Value> ConsumeDictionary();
-
-
- Optional<Value> ConsumeList();
-
- Optional<Value> ConsumeString();
-
-
-
-
- bool ConsumeStringRaw(StringBuilder* out);
-
-
-
-
- bool DecodeUTF16(uint32_t* out_code_point);
-
-
- Optional<Value> ConsumeNumber();
-
-
- bool ReadInt(bool allow_leading_zeros);
-
-
- Optional<Value> ConsumeLiteral();
-
-
-
-
- bool ConsumeIfMatch(StringPiece match);
-
-
-
- void ReportError(JsonParseError code, int column_adjust);
-
-
- static std::string FormatErrorMessage(int line, int column,
- const std::string& description);
-
- const int options_;
-
- const size_t max_depth_;
-
- StringPiece input_;
-
- int index_;
-
- size_t stack_depth_;
-
- int line_number_;
-
- int index_last_line_;
-
- JsonParseError error_code_;
- int error_line_;
- int error_column_;
- friend class JSONParserTest;
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, NextChar);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeDictionary);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeList);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeString);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeLiterals);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeNumbers);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ErrorMessages);
- DISALLOW_COPY_AND_ASSIGN(JSONParser);
- };
- BASE_EXPORT extern const char kUnicodeReplacementString[];
- }
- }
- #endif
|