Pivot to simpler approach. Passes JSONTestSuite

This commit is contained in:
2025-05-18 11:34:12 -04:00
parent 6cb7645675
commit 19208c0e0a
5 changed files with 998 additions and 13 deletions

View File

@@ -11,7 +11,7 @@
#include <nanobench.h>
#include <simdjson.h>
#include "parser.h"
#include "parser3.h"
// This is the JSON grammar in McKeeman Form.
@@ -539,28 +539,35 @@ TEST_CASE("parser2") {
MinifyState state;
{
auto copy = json;
Parser2 parser(&c, &state);
parser3::Parser3 parser(&c, &state);
int i = 0;
for (; i < copy.length() - 1; ++i) {
REQUIRE(parser.parse(copy.data() + i, 1) == Parser2::S_AGAIN);
REQUIRE(parser.parse(copy.data() + i, 1) == parser3::S_AGAIN);
}
CHECK(parser.parse(copy.data() + i, 1) == Parser2::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == Parser2::S_OK);
CHECK(parser.parse(copy.data() + i, 1) == parser3::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == parser3::S_OK);
puts("");
}
{
std::string copy = "{\"x\": [], \"y\": {}}";
Parser2 parser(&c, &state);
CHECK(parser.parse(copy.data(), copy.length()) == Parser2::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == Parser2::S_OK);
parser3::Parser3 parser(&c, &state);
CHECK(parser.parse(copy.data(), copy.length()) == parser3::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == parser3::S_OK);
puts("");
}
{
auto c = noopCallbacks();
std::string copy = "{\"a\":\"a";
Parser2 parser(&c, &state);
CHECK(parser.parse(copy.data(), copy.length()) == Parser2::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == Parser2::S_REJECT);
parser3::Parser3 parser(&c, &state);
CHECK(parser.parse(copy.data(), copy.length()) == parser3::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == parser3::S_REJECT);
}
{
auto c = noopCallbacks();
std::string copy = "[";
parser3::Parser3 parser(&c, &state);
CHECK(parser.parse(copy.data(), copy.length()) == parser3::S_AGAIN);
CHECK(parser.parse(nullptr, 0) == parser3::S_REJECT);
}
}
@@ -583,7 +590,7 @@ TEST_CASE("bench2") {
bench.unit("byte");
bench.run("parser2", [&]() {
auto copy = json;
Parser2 parser(&c, nullptr);
parser3::Parser3 parser(&c, nullptr);
bench.doNotOptimizeAway(parser.parse(copy.data(), copy.length()));
});
}