MUQ  0.4.3
nlohmann::detail::lexer< BasicJsonType, InputAdapterType > Class Template Reference

lexical analysis More...

#include <json.h>

Inheritance diagram for nlohmann::detail::lexer< BasicJsonType, InputAdapterType >:

Detailed Description

template<typename BasicJsonType, typename InputAdapterType>
class nlohmann::detail::lexer< BasicJsonType, InputAdapterType >

lexical analysis

This class organizes the lexical analysis during JSON deserialization.

Definition at line 5982 of file json.h.

Public Types

using token_type = typename lexer_base< BasicJsonType >::token_type
 
- Public Types inherited from nlohmann::detail::lexer_base< BasicJsonType >
enum class  token_type {
  uninitialized , literal_true , literal_false , literal_null ,
  value_string , value_unsigned , value_integer , value_float ,
  begin_array , begin_object , end_array , end_object ,
  name_separator , value_separator , parse_error , end_of_input ,
  literal_or_value
}
 token types for the parser More...
 

Public Member Functions

 lexer (InputAdapterType &&adapter, bool ignore_comments_=false)
 
 lexer (const lexer &)=delete
 
 lexer (lexer &&)=default
 
lexeroperator= (lexer &)=delete
 
lexeroperator= (lexer &&)=default
 
 ~lexer ()=default
 
constexpr number_integer_t get_number_integer () const noexcept
 return integer value More...
 
constexpr number_unsigned_t get_number_unsigned () const noexcept
 return unsigned integer value More...
 
constexpr number_float_t get_number_float () const noexcept
 return floating-point value More...
 
string_tget_string ()
 return current string value (implicitly resets the token; useful only once) More...
 
constexpr position_t get_position () const noexcept
 return position of last read token More...
 
std::string get_token_string () const
 
constexpr JSON_HEDLEY_RETURNS_NON_NULL const char * get_error_message () const noexcept
 return syntax error message More...
 
bool skip_bom ()
 skip the UTF-8 byte order mark More...
 
void skip_whitespace ()
 
token_type scan ()
 

Additional Inherited Members

- Static Public Member Functions inherited from nlohmann::detail::lexer_base< BasicJsonType >
JSON_HEDLEY_RETURNS_NON_NULL static JSON_HEDLEY_CONST const char * token_type_name (const token_type t) noexcept
 return name of values of type token_type (only used for errors) More...
 

Member Typedef Documentation

◆ char_int_type

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::char_int_type = typename std::char_traits<char_type>::int_type
private

Definition at line 5989 of file json.h.

◆ char_type

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::char_type = typename InputAdapterType::char_type
private

Definition at line 5988 of file json.h.

◆ number_float_t

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::number_float_t = typename BasicJsonType::number_float_t
private

Definition at line 5986 of file json.h.

◆ number_integer_t

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::number_integer_t = typename BasicJsonType::number_integer_t
private

Definition at line 5984 of file json.h.

◆ number_unsigned_t

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::number_unsigned_t = typename BasicJsonType::number_unsigned_t
private

Definition at line 5985 of file json.h.

◆ string_t

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::string_t = typename BasicJsonType::string_t
private

Definition at line 5987 of file json.h.

◆ token_type

template<typename BasicJsonType , typename InputAdapterType >
using nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_type = typename lexer_base<BasicJsonType>::token_type

Definition at line 5992 of file json.h.

Constructor & Destructor Documentation

◆ lexer() [1/3]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::lexer ( InputAdapterType &&  adapter,
bool  ignore_comments_ = false 
)
inlineexplicit

Definition at line 5994 of file json.h.

◆ lexer() [2/3]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::lexer ( const lexer< BasicJsonType, InputAdapterType > &  )
delete

◆ lexer() [3/3]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::lexer ( lexer< BasicJsonType, InputAdapterType > &&  )
default

◆ ~lexer()

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::~lexer ( )
default

Member Function Documentation

◆ add()

template<typename BasicJsonType , typename InputAdapterType >
void nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::add ( char_int_type  c)
inlineprivate

◆ for()

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::for ( )
inlineprivate

◆ get()

◆ get_codepoint()

template<typename BasicJsonType , typename InputAdapterType >
int nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_codepoint ( )
inlineprivate

get codepoint from 4 hex characters following \u

For input "\u c1 c2 c3 c4" the codepoint is: (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0)

Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The conversion is done by subtracting the offset (0x30, 0x37, and 0x57) between the ASCII value of the character and the desired integer value.

Returns
codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or non-hex character)

Definition at line 6040 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::current, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), and nlohmann::detail::JSON_ASSERT().

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_string().

◆ get_decimal_point()

template<typename BasicJsonType , typename InputAdapterType >
static JSON_HEDLEY_PURE char nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_decimal_point ( )
inlinestaticprivatenoexcept

return the locale-dependent decimal point

Definition at line 6014 of file json.h.

References nlohmann::detail::JSON_ASSERT().

◆ get_error_message()

template<typename BasicJsonType , typename InputAdapterType >
constexpr JSON_HEDLEY_RETURNS_NON_NULL const char* nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_error_message ( ) const
inlineconstexprnoexcept

return syntax error message

Definition at line 7344 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::error_message.

◆ get_number_float()

template<typename BasicJsonType , typename InputAdapterType >
constexpr number_float_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_number_float ( ) const
inlineconstexprnoexcept

return floating-point value

Definition at line 7295 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_float.

◆ get_number_integer()

template<typename BasicJsonType , typename InputAdapterType >
constexpr number_integer_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_number_integer ( ) const
inlineconstexprnoexcept

return integer value

Definition at line 7283 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_integer.

◆ get_number_unsigned()

template<typename BasicJsonType , typename InputAdapterType >
constexpr number_unsigned_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_number_unsigned ( ) const
inlineconstexprnoexcept

return unsigned integer value

Definition at line 7289 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_unsigned.

◆ get_position()

template<typename BasicJsonType , typename InputAdapterType >
constexpr position_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_position ( ) const
inlineconstexprnoexcept

◆ get_string()

template<typename BasicJsonType , typename InputAdapterType >
string_t& nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_string ( )
inline

return current string value (implicitly resets the token; useful only once)

Definition at line 7301 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_buffer.

◆ get_token_string()

template<typename BasicJsonType , typename InputAdapterType >
std::string nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_token_string ( ) const
inline

return the last read token (for errors only). Will never contain EOF (an arbitrary value that is not a valid char value, often -1), because 255 may legitimately occur. May contain NUL, which should be escaped.

Definition at line 7319 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_string.

Referenced by nlohmann::detail::parser< BasicJsonType, InputAdapterType >::parse().

◆ JSON_HEDLEY_NON_NULL() [1/4]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::JSON_HEDLEY_NON_NULL ( ) &
private

◆ JSON_HEDLEY_NON_NULL() [2/4]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::JSON_HEDLEY_NON_NULL ( ) &
private

◆ JSON_HEDLEY_NON_NULL() [3/4]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::JSON_HEDLEY_NON_NULL ( ) &
private

◆ JSON_HEDLEY_NON_NULL() [4/4]

template<typename BasicJsonType , typename InputAdapterType >
nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::JSON_HEDLEY_NON_NULL ( ) const
private
Parameters
[in]literal_textthe literal text to expect
[in]lengththe length of the passed literal text
[in]return_typethe token type to return on success

◆ next_byte_in_range()

template<typename BasicJsonType , typename InputAdapterType >
bool nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::next_byte_in_range ( std::initializer_list< char_int_type ranges)
inlineprivate

check if the next byte(s) are inside a given range

Adds the current byte and, for each passed range, reads a new byte and checks if it is inside the range. If a violation was detected, set up an error message and return false. Otherwise, return true.

Parameters
[in]rangeslist of integers; interpreted as list of pairs of inclusive lower and upper bound, respectively
Precondition
The passed list ranges must have 2, 4, or 6 elements; that is, 1, 2, or 3 pairs. This precondition is enforced by an assertion.
Returns
true if and only if no range violation was detected

Definition at line 6088 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::add(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::current, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::error_message, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), and nlohmann::detail::JSON_ASSERT().

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_string().

◆ operator=() [1/2]

template<typename BasicJsonType , typename InputAdapterType >
lexer& nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::operator= ( lexer< BasicJsonType, InputAdapterType > &&  )
default

◆ operator=() [2/2]

template<typename BasicJsonType , typename InputAdapterType >
lexer& nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::operator= ( lexer< BasicJsonType, InputAdapterType > &  )
delete

◆ reset()

template<typename BasicJsonType , typename InputAdapterType >
void nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::reset ( )
inlineprivatenoexcept

◆ scan()

◆ scan_comment()

template<typename BasicJsonType , typename InputAdapterType >
bool nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_comment ( )
inlineprivate

◆ scan_number()

template<typename BasicJsonType , typename InputAdapterType >
token_type nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_number ( )
inlineprivate

scan a number literal

This function scans a string according to Sect. 6 of RFC 7159.

The function is realized with a deterministic finite state machine derived from the grammar described in RFC 7159. Starting in state "init", the input is read and used to determined the next state. Only state "done" accepts the number. State "error" is a trap state to model errors. In the table below, "anything" means any character but the ones listed before.

state 0 1-9 e E + - . anything
init zero any1 [error] [error] minus [error] [error]
minus zero any1 [error] [error] [error] [error] [error]
zero done done exponent done done decimal1 done
any1 any1 any1 exponent done done decimal1 done
decimal1 decimal2 decimal2 [error] [error] [error] [error] [error]
decimal2 decimal2 decimal2 exponent done done done done
exponent any2 any2 [error] sign sign [error] [error]
sign any2 any2 [error] [error] [error] [error] [error]
any2 any2 any2 done done done done done

The state machine is realized with one label per state (prefixed with "scan_number_") and goto statements between them. The state machine contains cycles, but any cycle can be left when EOF is read. Therefore, the function is guaranteed to terminate.

During scanning, the read bytes are stored in token_buffer. This string is then converted to a signed integer, an unsigned integer, or a floating-point number.

Returns
token_type::value_unsigned, token_type::value_integer, or token_type::value_float if number could be successfully scanned, token_type::parse_error otherwise
Note
The scanner is independent of the current locale. Internally, the locale's decimal point is used instead of . to work with the locale-dependent converters.

Definition at line 6840 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::add(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::current, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::decimal_point_char, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::error_message, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), nlohmann::detail::JSON_ASSERT(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::reset(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_buffer, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::unget(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_float, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_integer, and nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_unsigned.

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan().

◆ scan_string()

template<typename BasicJsonType , typename InputAdapterType >
token_type nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_string ( )
inlineprivate

scan a string literal

This function scans a string according to Sect. 7 of RFC 7159. While scanning, bytes are escaped and copied into buffer token_buffer. Then the function returns successfully, token_buffer is not null-terminated (as it may contain \0 bytes), and token_buffer.size() is the number of bytes in the string.

Returns
token_type::value_string if string could be successfully scanned, token_type::parse_error otherwise
Note
In case of errors, variable error_message contains a textual description.

Definition at line 6125 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::add(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::current, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::error_message, nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get_codepoint(), nlohmann::detail::JSON_ASSERT(), nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::next_byte_in_range(), and nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::reset().

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan().

◆ skip_bom()

template<typename BasicJsonType , typename InputAdapterType >
bool nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::skip_bom ( )
inline

skip the UTF-8 byte order mark

Returns
true iff there is no BOM or the correct BOM has been skipped

Definition at line 7357 of file json.h.

References nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), and nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::unget().

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan().

◆ skip_whitespace()

template<typename BasicJsonType , typename InputAdapterType >
void nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::skip_whitespace ( )
inline

◆ unget()

template<typename BasicJsonType , typename InputAdapterType >
void nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::unget ( )
inlineprivate

Member Data Documentation

◆ current

◆ decimal_point_char

template<typename BasicJsonType , typename InputAdapterType >
const char_int_type nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::decimal_point_char = '.'
private

the decimal point

Definition at line 7499 of file json.h.

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan_number().

◆ error_message

◆ ia

template<typename BasicJsonType , typename InputAdapterType >
InputAdapterType nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::ia
private

input adapter

Definition at line 7470 of file json.h.

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get().

◆ ignore_comments

template<typename BasicJsonType , typename InputAdapterType >
const bool nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::ignore_comments = false
private

whether comments should be ignored (true) or signaled as errors (false)

Definition at line 7473 of file json.h.

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::scan().

◆ length

template<typename BasicJsonType , typename InputAdapterType >
const std::size_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::length
private

Definition at line 7171 of file json.h.

◆ next_unget

template<typename BasicJsonType , typename InputAdapterType >
bool nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::next_unget = false
private

whether the next get() call should just return current

Definition at line 7479 of file json.h.

Referenced by nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::get(), and nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::unget().

◆ noexcept

template<typename BasicJsonType , typename InputAdapterType >
const char char **endptr nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::noexcept
private
Initial value:
{
f = std::strtof(str, endptr)
const char * str
Definition: json.h:6783

Definition at line 6783 of file json.h.

◆ position

template<typename BasicJsonType , typename InputAdapterType >
position_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::position {}
private

◆ return_type [1/2]

template<typename BasicJsonType , typename InputAdapterType >
const std::size_t token_type nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::return_type
private
Initial value:
{
JSON_ASSERT(std::char_traits<char_type>::to_char_type(current) == literal_text[0])
char_int_type current
the current character
Definition: json.h:7476
JSON_ASSERT(std::isfinite(value))

Definition at line 7172 of file json.h.

◆ return_type [2/2]

template<typename BasicJsonType , typename InputAdapterType >
return nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::return_type
private

Definition at line 7183 of file json.h.

◆ str

template<typename BasicJsonType , typename InputAdapterType >
const char * nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::str
private

◆ token_buffer

template<typename BasicJsonType , typename InputAdapterType >
string_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_buffer {}
private

◆ token_string

template<typename BasicJsonType , typename InputAdapterType >
std::vector<char_type> nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::token_string {}
private

◆ value_float

template<typename BasicJsonType , typename InputAdapterType >
number_float_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_float = 0
private

◆ value_integer

template<typename BasicJsonType , typename InputAdapterType >
number_integer_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_integer = 0
private

◆ value_unsigned

template<typename BasicJsonType , typename InputAdapterType >
number_unsigned_t nlohmann::detail::lexer< BasicJsonType, InputAdapterType >::value_unsigned = 0
private

The documentation for this class was generated from the following file: