feat: directly use sub-scanners in special scanner

This commit is contained in:
ToruNiina
2025-02-08 00:59:08 +09:00
parent 46db8643c1
commit 37359d42e6
2 changed files with 77 additions and 43 deletions

View File

@@ -31,12 +31,28 @@ class non_ascii final : public scanner_base
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;
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
@@ -55,8 +71,9 @@ class non_ascii final : public scanner_base
}
private:
either scanner_;
sequence utf8_2B_;
sequence utf8_3B_;
sequence utf8_4B_;
};
// ===========================================================================
@@ -95,7 +112,11 @@ class digit final : public scanner_base
public:
explicit digit(const spec&) noexcept;
explicit digit(const spec&) noexcept
: scanner_(char_type('0'), char_type('9'))
{}
~digit() override = default;
region scan(location& loc) const override
@@ -131,12 +152,23 @@ class alpha final : public scanner_base
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;
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
@@ -156,7 +188,8 @@ class alpha final : public scanner_base
private:
either scanner_;
character_in_range lowercase_;
character_in_range uppercase_;
};
class hexdig final : public scanner_base
@@ -167,12 +200,28 @@ class hexdig final : public scanner_base
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;
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
@@ -192,7 +241,9 @@ class hexdig final : public scanner_base
private:
either scanner_;
digit digit_;
character_in_range lowercase_;
character_in_range uppercase_;
};
sequence num_suffix(const spec& s);
@@ -304,7 +355,6 @@ sequence dot_sep(const spec& s);
sequence dotted_key(const spec& s);
class key final : public scanner_base
{
public:
@@ -313,12 +363,23 @@ class key final : public scanner_base
public:
explicit key(const spec& s) noexcept;
explicit key(const spec& s) noexcept
: dotted_(dotted_key(s)),
simple_(simple_key(s))
{}
~key() override = default;
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
@@ -338,7 +399,8 @@ class key final : public scanner_base
private:
either scanner_;
sequence dotted_;
either simple_;
};
sequence keyval_sep(const spec& s);

View File

@@ -49,11 +49,6 @@ TOML11_INLINE sequence utf8_4bytes(const spec&)
), 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
@@ -116,25 +111,6 @@ TOML11_INLINE either boolean(const spec&)
// ===========================================================================
// 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)
// graph = ([a-zA-Z0-9]|unicode mb char)
// 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)
{
return sequence(ws(s), character('='), ws(s));