Improve scan

This commit is contained in:
2025-06-20 10:02:37 -04:00
parent 976f64b7d3
commit 4f24a44cb2

View File

@@ -16,120 +16,307 @@
namespace parser3 { namespace parser3 {
class NumDfa { struct NumDfa {
constexpr static uint64_t num_dfa_table[256] = { constexpr static uint64_t num_dfa_table[256] = {
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6d80db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6d86d80db6db6ull, 0xd8cdb6336db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb0a9edaa4927aaull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0x0ull,
0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0x0ull,
0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0xdb0ab0daa492c2aull, 0x0ull,
0xdb0ab0daa492c2aull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xd98db6636636db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xd98db6636636db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x36000ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x36600ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x12480000000000ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47b091ec00ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x780aa47aa91ea80ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xc30c000000000ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0xdb6db6db6db6db6ull, 0x0ull,
0xdb6db6db6db6db6ull, 0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0xc30c000000000ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
0x0ull,
}; };
uint8_t state = 36;
public:
// Restore this dfa to its start state // Restore this dfa to its start state
void reset() { state = 36; } void reset() { state = 6; }
// Return true if this dfa is in an accept state. You probably want to call // Return true if this dfa is in an accept state. You probably want to call
// scan until the match ends first. // scan until the match ends first.
bool accept() const { bool accept() const {
return (state & 63) == 18 || (state & 63) == 42 || (state & 63) == 48 || return (state & 63) == 30 || (state & 63) == 36 || (state & 63) == 48 ||
(state & 63) == 30; (state & 63) == 42;
} }
// return value either points to the first byte which does not match, or // return value either points to the first byte which does not match, or
// bufEnd. Leaves the dfa in the last state of the match. // bufEnd. Leaves the dfa in the last state of the match.
const char *scan(const char *buf, const char *bufEnd) { const char *scan(const char *buf, const char *bufEnd) {
while (buf != bufEnd) { auto state_ = state;
uint64_t row = num_dfa_table[uint8_t(*buf)]; for (;;) {
auto next = row >> (state & 63); constexpr int kStride = 16;
if ((next & 63) == 54) { if (bufEnd - buf < kStride) [[unlikely]] {
break; while (buf != bufEnd) {
uint64_t row = num_dfa_table[uint8_t(*buf)];
auto next = row >> (state_ & 63);
if ((next & 63) == 0) {
break;
}
state_ = next;
++buf;
}
state = state_;
return buf;
}
for (int i = 0; i < kStride; ++i) {
uint64_t row = num_dfa_table[uint8_t(*buf)];
auto next = row >> (state_ & 63);
if ((next & 63) == 0) {
state = state_;
return buf;
}
state_ = next;
++buf;
} }
state = next;
++buf;
} }
return buf;
} }
private:
uint64_t state = 6;
}; };
typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *, typedef PRESERVE_NONE WeaselJsonStatus (*Continuation)(struct Parser3 *,