mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-09-18 02:08:09 +08:00
feat: directly use sub-scanners in special scanner
This commit is contained in:
@@ -31,12 +31,28 @@ class non_ascii final : public scanner_base
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit non_ascii(const spec& s) noexcept;
|
explicit non_ascii(const spec& s) noexcept
|
||||||
|
: utf8_2B_(utf8_2bytes(s)),
|
||||||
|
utf8_3B_(utf8_3bytes(s)),
|
||||||
|
utf8_4B_(utf8_4bytes(s))
|
||||||
|
{}
|
||||||
~non_ascii() override = default;
|
~non_ascii() override = default;
|
||||||
|
|
||||||
region scan(location& loc) const override
|
region scan(location& loc) const override
|
||||||
{
|
{
|
||||||
return scanner_.scan(loc);
|
{
|
||||||
|
const auto reg = utf8_2B_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = utf8_3B_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = utf8_4B_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
return region{};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string expected_chars(location&) const override
|
std::string expected_chars(location&) const override
|
||||||
@@ -55,8 +71,9 @@ class non_ascii final : public scanner_base
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
sequence utf8_2B_;
|
||||||
either scanner_;
|
sequence utf8_3B_;
|
||||||
|
sequence utf8_4B_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
@@ -95,7 +112,11 @@ class digit final : public scanner_base
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit digit(const spec&) noexcept;
|
explicit digit(const spec&) noexcept
|
||||||
|
: scanner_(char_type('0'), char_type('9'))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
~digit() override = default;
|
~digit() override = default;
|
||||||
|
|
||||||
region scan(location& loc) const override
|
region scan(location& loc) const override
|
||||||
@@ -131,12 +152,23 @@ class alpha final : public scanner_base
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit alpha(const spec&) noexcept;
|
explicit alpha(const spec&) noexcept
|
||||||
|
: lowercase_(char_type('a'), char_type('z')),
|
||||||
|
uppercase_(char_type('A'), char_type('Z'))
|
||||||
|
{}
|
||||||
~alpha() override = default;
|
~alpha() override = default;
|
||||||
|
|
||||||
region scan(location& loc) const override
|
region scan(location& loc) const override
|
||||||
{
|
{
|
||||||
return scanner_.scan(loc);
|
{
|
||||||
|
const auto reg = lowercase_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = uppercase_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
return region{};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string expected_chars(location&) const override
|
std::string expected_chars(location&) const override
|
||||||
@@ -156,7 +188,8 @@ class alpha final : public scanner_base
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
either scanner_;
|
character_in_range lowercase_;
|
||||||
|
character_in_range uppercase_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class hexdig final : public scanner_base
|
class hexdig final : public scanner_base
|
||||||
@@ -167,12 +200,28 @@ class hexdig final : public scanner_base
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit hexdig(const spec& s) noexcept;
|
explicit hexdig(const spec& s) noexcept
|
||||||
|
: digit_(s),
|
||||||
|
lowercase_(char_type('a'), char_type('f')),
|
||||||
|
uppercase_(char_type('A'), char_type('F'))
|
||||||
|
{}
|
||||||
~hexdig() override = default;
|
~hexdig() override = default;
|
||||||
|
|
||||||
region scan(location& loc) const override
|
region scan(location& loc) const override
|
||||||
{
|
{
|
||||||
return scanner_.scan(loc);
|
{
|
||||||
|
const auto reg = digit_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = lowercase_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = uppercase_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
return region{};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string expected_chars(location&) const override
|
std::string expected_chars(location&) const override
|
||||||
@@ -192,7 +241,9 @@ class hexdig final : public scanner_base
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
either scanner_;
|
digit digit_;
|
||||||
|
character_in_range lowercase_;
|
||||||
|
character_in_range uppercase_;
|
||||||
};
|
};
|
||||||
|
|
||||||
sequence num_suffix(const spec& s);
|
sequence num_suffix(const spec& s);
|
||||||
@@ -304,7 +355,6 @@ sequence dot_sep(const spec& s);
|
|||||||
|
|
||||||
sequence dotted_key(const spec& s);
|
sequence dotted_key(const spec& s);
|
||||||
|
|
||||||
|
|
||||||
class key final : public scanner_base
|
class key final : public scanner_base
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -313,12 +363,23 @@ class key final : public scanner_base
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit key(const spec& s) noexcept;
|
explicit key(const spec& s) noexcept
|
||||||
|
: dotted_(dotted_key(s)),
|
||||||
|
simple_(simple_key(s))
|
||||||
|
{}
|
||||||
~key() override = default;
|
~key() override = default;
|
||||||
|
|
||||||
region scan(location& loc) const override
|
region scan(location& loc) const override
|
||||||
{
|
{
|
||||||
return scanner_.scan(loc);
|
{
|
||||||
|
const auto reg = dotted_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto reg = simple_.scan(loc);
|
||||||
|
if(reg.is_ok()) {return reg;}
|
||||||
|
}
|
||||||
|
return region{};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string expected_chars(location&) const override
|
std::string expected_chars(location&) const override
|
||||||
@@ -338,7 +399,8 @@ class key final : public scanner_base
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
either scanner_;
|
sequence dotted_;
|
||||||
|
either simple_;
|
||||||
};
|
};
|
||||||
|
|
||||||
sequence keyval_sep(const spec& s);
|
sequence keyval_sep(const spec& s);
|
||||||
|
@@ -49,11 +49,6 @@ TOML11_INLINE sequence utf8_4bytes(const spec&)
|
|||||||
), character_in_range(0x80, 0xBF), character_in_range(0x80, 0xBF));
|
), character_in_range(0x80, 0xBF), character_in_range(0x80, 0xBF));
|
||||||
}
|
}
|
||||||
|
|
||||||
TOML11_INLINE non_ascii::non_ascii(const spec& s) noexcept
|
|
||||||
: scanner_(utf8_2bytes(s), utf8_3bytes(s), utf8_4bytes(s))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Whitespace
|
// Whitespace
|
||||||
|
|
||||||
@@ -116,25 +111,6 @@ TOML11_INLINE either boolean(const spec&)
|
|||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Integer
|
// Integer
|
||||||
|
|
||||||
TOML11_INLINE digit::digit(const spec&) noexcept
|
|
||||||
: scanner_(char_type('0'), char_type('9'))
|
|
||||||
{}
|
|
||||||
|
|
||||||
TOML11_INLINE alpha::alpha(const spec&) noexcept
|
|
||||||
: scanner_(
|
|
||||||
character_in_range(char_type('a'), char_type('z')),
|
|
||||||
character_in_range(char_type('A'), char_type('Z'))
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
TOML11_INLINE hexdig::hexdig(const spec& s) noexcept
|
|
||||||
: scanner_(
|
|
||||||
digit(s),
|
|
||||||
character_in_range(char_type('a'), char_type('f')),
|
|
||||||
character_in_range(char_type('A'), char_type('F'))
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
// non-digit-graph = ([a-zA-Z]|unicode mb char)
|
// non-digit-graph = ([a-zA-Z]|unicode mb char)
|
||||||
// graph = ([a-zA-Z0-9]|unicode mb char)
|
// graph = ([a-zA-Z0-9]|unicode mb char)
|
||||||
// suffix = _ non-digit-graph (graph | _graph)
|
// suffix = _ non-digit-graph (graph | _graph)
|
||||||
@@ -718,10 +694,6 @@ TOML11_INLINE sequence dotted_key(const spec& s)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TOML11_INLINE key::key(const spec& s) noexcept
|
|
||||||
: scanner_(dotted_key(s), simple_key(s))
|
|
||||||
{}
|
|
||||||
|
|
||||||
TOML11_INLINE sequence keyval_sep(const spec& s)
|
TOML11_INLINE sequence keyval_sep(const spec& s)
|
||||||
{
|
{
|
||||||
return sequence(ws(s), character('='), ws(s));
|
return sequence(ws(s), character('='), ws(s));
|
||||||
|
Reference in New Issue
Block a user