template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
class nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer
lexical analysis
This class organizes the lexical analysis during JSON deserialization. The core of it is a scanner generated by re2c that processes a buffer and recognizes tokens according to RFC 7159.
Definition at line 7079 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
the char type to use in the lexer
Definition at line 7102 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
token types for the parser
Enumerator |
---|
uninitialized |
indicating the scanner is uninitialized
|
literal_true |
the "true" literal
|
literal_false |
the "false" literal
|
literal_null |
the "null" literal
|
value_string |
a string – use get_string() for actual value
|
value_number |
a number – use get_number() for actual value
|
begin_array |
the character for array begin "["
|
begin_object |
the character for object begin "{"
|
end_array |
the character for array end "]"
|
end_object |
the character for object end "}"
|
name_separator |
the name separator ":"
|
value_separator |
the value separator ","
|
parse_error |
indicating a parse error
|
end_of_input |
indicating the end of the input buffer
|
Definition at line 7083 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::lexer |
( |
const string_t & |
s | ) |
|
|
inlineexplicitnoexcept |
constructor with a given buffer
Definition at line 7105 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::lexer |
( |
std::istream * |
s | ) |
|
|
inlineexplicitnoexcept |
constructor with a given stream
Definition at line 7115 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::lexer |
( |
| ) |
|
|
default |
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::lexer |
( |
const lexer & |
| ) |
|
|
delete |
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
template<typename T_A , typename T_B >
static bool nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::attempt_cast |
( |
T_A |
source, |
|
|
T_B & |
dest |
|
) |
| |
|
inlinestatic |
static_cast between two types and indicate if it results in error
This function performs a static_cast
between source and dest. It then checks if a static_cast
back to dest produces an error.
- Parameters
-
[in] | source | the value to cast from |
[in,out] | dest | the value to cast to |
- Returns
- true iff the cast was performed without error
Definition at line 8263 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
void nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::get_number |
( |
basic_json & |
result | ) |
const |
|
inline |
return number value for number tokens
This function translates the last token into the most appropriate number type (either integer, unsigned integer or floating point), which is passed back to the caller via the result parameter. The pointer m_start points to the beginning of the parsed number. We first examine the first character to determine the sign of the number and then pass this pointer to either std::strtoull (if positive) or std::strtoll (if negative), both of which set endptr to the first character past the converted number. If this pointer is not the same as m_cursor, then either more or less characters have been used during the comparison.
This can happen for inputs like "01" which will be treated like number 0 followed by number 1. This will also occur for valid floating point inputs like "12e3" will be incorrectly read as 12. Numbers that are too large or too small for a signed/unsigned long long will cause a range error (errno set to ERANGE). The parsed number is cast to a number_integer_t/number_unsigned_t using the helper function attempt_cast, which returns false if the cast could not be peformed without error.
In any of these cases (more/less characters read, range error or a cast error) the pointer is passed to std:strtod, which also sets endptr to the first character past the converted number. The resulting number_float_t is then cast to a number_integer_t/number_unsigned_t using attempt_cast and if no error occurs is stored in that form, otherwise it is stored as a number_float_t.
A final comparison is made of endptr and if still not the same as m_cursor a bad input is assumed and result parameter is set to NAN.
- Parameters
-
[out] | result | basic_json object to receive the number, or NAN if the conversion read past the current token. The latter case needs to be treated by the caller function. |
Definition at line 8307 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
string_t nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::get_string |
( |
| ) |
const |
|
inline |
return string value for string tokens
The function iterates the characters between the opening and closing quotes of the string value. The complete string is the range [m_start,m_cursor). Consequently, we iterate from m_start+1 to m_cursor-1.
We differentiate two cases:
- Escaped characters. In this case, a new character is constructed according to the nature of the escape. Some escapes create new characters (e.g.,
"\\\\n"
is replaced by "\\n"
), some are copied as is (e.g., "\\\\\\\\"
). Furthermore, Unicode escapes of the shape "\\\\uxxxx"
need special care. In this case, to_unicode takes care of the construction of the values.
- Unescaped characters are copied as is.
- Returns
- string value of current token without opening and closing quotes
- Exceptions
-
std::out_of_range | if to_unicode fails |
Definition at line 8082 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
string_t nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::get_token |
( |
| ) |
const |
|
inline |
return string representation of last read token
Definition at line 8054 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
lexer nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::operator= |
( |
const lexer & |
| ) |
|
|
delete |
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
token_type nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::scan |
( |
| ) |
|
|
inlinenoexcept |
This function implements a scanner for JSON. It is specified using regular expressions that try to follow RFC 7159 as close as possible. These regular expressions are then translated into a minimized deterministic finite automaton (DFA) by the tool re2c. As a result, the translated code for this function consists of a large block of code with goto
jumps.
- Returns
- the class of the next token read from the buffer
Definition at line 7263 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
long double nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::str_to_float_t |
( |
long double * |
, |
|
|
char ** |
endptr |
|
) |
| const |
|
inline |
parse floating point number
This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type supplied via the first parameter. Set this to static_cast<number_float_t*>(nullptr).
- Parameters
-
[in] | type | the number_float_t in use |
[in,out] | endptr | recieves a pointer to the first character after the number |
- Returns
- the floating point number
- Bug:
- This function uses
std::strtof
, std::strtod
, or std::strtold
which use the current C locale to determine which character is used as decimal point character. This may yield to parse errors if the locale does not used .
.
Definition at line 8205 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
double nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::str_to_float_t |
( |
double * |
, |
|
|
char ** |
endptr |
|
) |
| const |
|
inline |
parse floating point number
This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type supplied via the first parameter. Set this to static_cast<number_float_t*>(nullptr).
- Parameters
-
[in] | type | the number_float_t in use |
[in,out] | endptr | recieves a pointer to the first character after the number |
- Returns
- the floating point number
Definition at line 8225 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
float nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::str_to_float_t |
( |
float * |
, |
|
|
char ** |
endptr |
|
) |
| const |
|
inline |
parse floating point number
This function (and its overloads) serves to select the most approprate standard floating point number parsing function based on the type supplied via the first parameter. Set this to static_cast<number_float_t*>(nullptr).
- Parameters
-
[in] | type | the number_float_t in use |
[in,out] | endptr | recieves a pointer to the first character after the number |
- Returns
- the floating point number
Definition at line 8245 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
static string_t nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::to_unicode |
( |
const std::size_t |
codepoint1, |
|
|
const std::size_t |
codepoint2 = 0 |
|
) |
| |
|
inlinestatic |
create a string from a Unicode code point
- Parameters
-
[in] | codepoint1 | the code point (can be high surrogate) |
[in] | codepoint2 | the code point (can be low surrogate or 0) |
- Returns
- string representation of the code point
- Exceptions
-
std::out_of_range | if code point is >0x10ffff; example: "code
points above 0x10FFFF are invalid" |
std::invalid_argument | if the low surrogate is invalid; example: ""missing or wrong low surrogate"" |
- See also
- http://en.wikipedia.org/wiki/UTF-8#Sample_code
Definition at line 7148 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
static std::string nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::token_type_name |
( |
token_type |
t | ) |
|
|
inlinestatic |
return name of values of type token_type (only used for errors)
Definition at line 7213 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
void nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::yyfill |
( |
| ) |
|
|
inlinenoexcept |
append data from the stream to the internal buffer
Definition at line 8028 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
string_t nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_buffer |
|
private |
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
const lexer_char_t* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_content = nullptr |
|
private |
the buffer pointer
Definition at line 8376 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
const lexer_char_t* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_cursor = nullptr |
|
private |
pointer to the current symbol
Definition at line 8382 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
const lexer_char_t* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_limit = nullptr |
|
private |
pointer to the end of the buffer
Definition at line 8384 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
const lexer_char_t* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_marker = nullptr |
|
private |
pointer for backtracking information
Definition at line 8380 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
const lexer_char_t* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_start = nullptr |
|
private |
pointer to the beginning of the current symbol
Definition at line 8378 of file json.hpp.
template<template< typename U, typename V, typename...Args > class ObjectType = std::map, template< typename U, typename...Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator>
std::istream* nlohmann::basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType >::lexer::m_stream = nullptr |
|
private |
optional input stream
Definition at line 8372 of file json.hpp.