♻️ adjusting lexer/parser in symmetry to #1006
This commit is contained in:
parent
b56ac86471
commit
8557151d90
5 changed files with 34 additions and 12 deletions
|
@ -32,6 +32,7 @@ class lexer
|
||||||
using number_integer_t = typename BasicJsonType::number_integer_t;
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
using number_float_t = typename BasicJsonType::number_float_t;
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// token types for the parser
|
/// token types for the parser
|
||||||
|
@ -1130,7 +1131,7 @@ scan_number_done:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return current string value (implicitly resets the token; useful only once)
|
/// return current string value (implicitly resets the token; useful only once)
|
||||||
std::string&& move_string()
|
string_t&& move_string()
|
||||||
{
|
{
|
||||||
return std::move(token_buffer);
|
return std::move(token_buffer);
|
||||||
}
|
}
|
||||||
|
@ -1260,7 +1261,7 @@ scan_number_done:
|
||||||
std::vector<char> token_string {};
|
std::vector<char> token_string {};
|
||||||
|
|
||||||
/// buffer for variable-length tokens (numbers, strings)
|
/// buffer for variable-length tokens (numbers, strings)
|
||||||
std::string token_buffer {};
|
string_t token_buffer {};
|
||||||
|
|
||||||
/// a description of occurred lexer errors
|
/// a description of occurred lexer errors
|
||||||
const char* error_message = "";
|
const char* error_message = "";
|
||||||
|
|
|
@ -32,6 +32,7 @@ class parser
|
||||||
using number_integer_t = typename BasicJsonType::number_integer_t;
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
using number_float_t = typename BasicJsonType::number_float_t;
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
using lexer_t = lexer<BasicJsonType>;
|
using lexer_t = lexer<BasicJsonType>;
|
||||||
using token_type = typename lexer_t::token_type;
|
using token_type = typename lexer_t::token_type;
|
||||||
|
|
||||||
|
@ -175,7 +176,7 @@ class parser
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse values
|
// parse values
|
||||||
std::string key;
|
string_t key;
|
||||||
BasicJsonType value;
|
BasicJsonType value;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1871,6 +1871,7 @@ class lexer
|
||||||
using number_integer_t = typename BasicJsonType::number_integer_t;
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
using number_float_t = typename BasicJsonType::number_float_t;
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// token types for the parser
|
/// token types for the parser
|
||||||
|
@ -2969,7 +2970,7 @@ scan_number_done:
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return current string value (implicitly resets the token; useful only once)
|
/// return current string value (implicitly resets the token; useful only once)
|
||||||
std::string&& move_string()
|
string_t&& move_string()
|
||||||
{
|
{
|
||||||
return std::move(token_buffer);
|
return std::move(token_buffer);
|
||||||
}
|
}
|
||||||
|
@ -3099,7 +3100,7 @@ scan_number_done:
|
||||||
std::vector<char> token_string {};
|
std::vector<char> token_string {};
|
||||||
|
|
||||||
/// buffer for variable-length tokens (numbers, strings)
|
/// buffer for variable-length tokens (numbers, strings)
|
||||||
std::string token_buffer {};
|
string_t token_buffer {};
|
||||||
|
|
||||||
/// a description of occurred lexer errors
|
/// a description of occurred lexer errors
|
||||||
const char* error_message = "";
|
const char* error_message = "";
|
||||||
|
@ -3155,6 +3156,7 @@ class parser
|
||||||
using number_integer_t = typename BasicJsonType::number_integer_t;
|
using number_integer_t = typename BasicJsonType::number_integer_t;
|
||||||
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
|
||||||
using number_float_t = typename BasicJsonType::number_float_t;
|
using number_float_t = typename BasicJsonType::number_float_t;
|
||||||
|
using string_t = typename BasicJsonType::string_t;
|
||||||
using lexer_t = lexer<BasicJsonType>;
|
using lexer_t = lexer<BasicJsonType>;
|
||||||
using token_type = typename lexer_t::token_type;
|
using token_type = typename lexer_t::token_type;
|
||||||
|
|
||||||
|
@ -3298,7 +3300,7 @@ class parser
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse values
|
// parse values
|
||||||
std::string key;
|
string_t key;
|
||||||
BasicJsonType value;
|
BasicJsonType value;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@ CPPFLAGS += -I ../single_include -I . -I thirdparty/catch -I thirdparty/fifo_map
|
||||||
SOURCES = src/unit.cpp \
|
SOURCES = src/unit.cpp \
|
||||||
src/unit-algorithms.cpp \
|
src/unit-algorithms.cpp \
|
||||||
src/unit-allocator.cpp \
|
src/unit-allocator.cpp \
|
||||||
|
src/unit-alt-string.cpp \
|
||||||
src/unit-capacity.cpp \
|
src/unit-capacity.cpp \
|
||||||
src/unit-cbor.cpp \
|
src/unit-cbor.cpp \
|
||||||
src/unit-class_const_iterator.cpp \
|
src/unit-class_const_iterator.cpp \
|
||||||
|
|
|
@ -42,7 +42,7 @@ class alt_string
|
||||||
using value_type = std::string::value_type;
|
using value_type = std::string::value_type;
|
||||||
|
|
||||||
alt_string(const char* str): str_impl(str) {}
|
alt_string(const char* str): str_impl(str) {}
|
||||||
alt_string(const char* str, size_t count): str_impl(str, count) {}
|
alt_string(const char* str, std::size_t count): str_impl(str, count) {}
|
||||||
alt_string(size_t count, char chr): str_impl(count, chr) {}
|
alt_string(size_t count, char chr): str_impl(count, chr) {}
|
||||||
alt_string() = default;
|
alt_string() = default;
|
||||||
|
|
||||||
|
@ -70,17 +70,17 @@ class alt_string
|
||||||
return str_impl != op;
|
return str_impl != op;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const noexcept
|
std::size_t size() const noexcept
|
||||||
{
|
{
|
||||||
return str_impl.size();
|
return str_impl.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize (size_t n)
|
void resize (std::size_t n)
|
||||||
{
|
{
|
||||||
str_impl.resize(n);
|
str_impl.resize(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize (size_t n, char c)
|
void resize (std::size_t n, char c)
|
||||||
{
|
{
|
||||||
str_impl.resize(n, c);
|
str_impl.resize(n, c);
|
||||||
}
|
}
|
||||||
|
@ -101,12 +101,12 @@ class alt_string
|
||||||
return str_impl.c_str();
|
return str_impl.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
char& operator[](int index)
|
char& operator[](std::size_t index)
|
||||||
{
|
{
|
||||||
return str_impl[index];
|
return str_impl[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
const char& operator[](int index) const
|
const char& operator[](std::size_t index) const
|
||||||
{
|
{
|
||||||
return str_impl[index];
|
return str_impl[index];
|
||||||
}
|
}
|
||||||
|
@ -121,6 +121,16 @@ class alt_string
|
||||||
return str_impl.back();
|
return str_impl.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
str_impl.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const value_type* data()
|
||||||
|
{
|
||||||
|
return str_impl.data();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string str_impl;
|
std::string str_impl;
|
||||||
};
|
};
|
||||||
|
@ -192,4 +202,11 @@ TEST_CASE("alternative string type")
|
||||||
CHECK(dump == R"({"list":[1,0,2]})");
|
CHECK(dump == R"({"list":[1,0,2]})");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("parse")
|
||||||
|
{
|
||||||
|
auto doc = alt_json::parse("{\"foo\": \"bar\"}");
|
||||||
|
alt_string dump = doc.dump();
|
||||||
|
CHECK(dump == R"({"foo":"bar"})");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue