From 1442e3e21f4a8eb9d7693d83c496b040b542b942 Mon Sep 17 00:00:00 2001 From: yhirose Date: Fri, 15 Jan 2021 17:26:29 -0500 Subject: [PATCH] Unicode char support --- README.md | 1 + docs/native.wasm | Bin 352612 -> 352750 bytes peglib.h | 21 +++++++++++---------- test/test3.cc | 21 +++++++++++++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0ee227a..bd32baa 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ The PEG syntax is well described on page 2 in the [document](http://www.brynosau * `<` ... `>` (Token boundary operator) * `~` (Ignore operator) * `\x20` (Hex number char) + * `\u10FFFF` (Unicode char) * `%whitespace` (Automatic whitespace skipping) * `%word` (Word expression) * `$name(` ... `)` (Capture scope operator) diff --git a/docs/native.wasm b/docs/native.wasm index c77e0415cf22070f0250e03220c3cd3672c9a6e2..1705f0c42e708a883ff6ce7601bc5d6ca90b5773 100644 GIT binary patch delta 34999 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 ULPPbTL#heBnpW#;b@^le2i=o-K>z>% delta 27269 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 diff --git a/peglib.h b/peglib.h index 878e3c7..806724d 100644 --- a/peglib.h +++ b/peglib.h @@ -2963,13 +2963,16 @@ private: g["Spacing"]); g["Range"] <= cho(seq(g["Char"], chr('-'), g["Char"]), g["Char"]); - g["Char"] <= cho(seq(chr('\\'), cls("nrt'\"[]\\^")), - seq(chr('\\'), cls("0-3"), cls("0-7"), cls("0-7")), - seq(chr('\\'), cls("0-7"), opt(cls("0-7"))), - seq(lit("\\x"), cls("0-9a-fA-F"), opt(cls("0-9a-fA-F"))), - seq(lit("\\u"), cls("0-9a-fA-F"), cls("0-9a-fA-F"), - cls("0-9a-fA-F"), cls("0-9a-fA-F")), - seq(npd(chr('\\')), dot())); + g["Char"] <= + cho(seq(chr('\\'), cls("nrt'\"[]\\^")), + seq(chr('\\'), cls("0-3"), cls("0-7"), cls("0-7")), + seq(chr('\\'), cls("0-7"), opt(cls("0-7"))), + seq(lit("\\x"), cls("0-9a-fA-F"), opt(cls("0-9a-fA-F"))), + seq(lit("\\u"), + cho(seq(cho(seq(chr('0'), cls("0-9a-fA-F")), lit("10")), + rep(cls("0-9a-fA-F"), 4, 4)), + rep(cls("0-9a-fA-F"), 4, 5))), + seq(npd(chr('\\')), dot())); g["Repetition"] <= seq(g["BeginBlacket"], g["RepetitionRange"], g["EndBlacket"]); @@ -3210,9 +3213,7 @@ private: } auto ope = ref(*data.grammar, ident, vs.sv().data(), is_macro, args); - if (ident == RECOVER_DEFINITION_NAME) { - ope = rec(ope); - } + if (ident == RECOVER_DEFINITION_NAME) { ope = rec(ope); } if (ignore) { return ign(ope); diff --git a/test/test3.cc b/test/test3.cc index c309131..f22556c 100644 --- a/test/test3.cc +++ b/test/test3.cc @@ -239,6 +239,27 @@ TEST_CASE("PEG Char", "[peg]") REQUIRE(exact(g, "Char", "\\0") == true); REQUIRE(exact(g, "Char", "\\7") == true); REQUIRE(exact(g, "Char", "\\8") == false); + REQUIRE(exact(g, "Char", "\\x0") == true); + REQUIRE(exact(g, "Char", "\\x00") == true); + REQUIRE(exact(g, "Char", "\\x000") == false); + REQUIRE(exact(g, "Char", "\\xa") == true); + REQUIRE(exact(g, "Char", "\\xab") == true); + REQUIRE(exact(g, "Char", "\\xabc") == false); + REQUIRE(exact(g, "Char", "\\xA") == true); + REQUIRE(exact(g, "Char", "\\xAb") == true); + REQUIRE(exact(g, "Char", "\\xAbc") == false); + REQUIRE(exact(g, "Char", "\\xg") == false); + REQUIRE(exact(g, "Char", "\\xga") == false); + REQUIRE(exact(g, "Char", "\\u0") == false); + REQUIRE(exact(g, "Char", "\\u00") == false); + REQUIRE(exact(g, "Char", "\\u0000") == true); + REQUIRE(exact(g, "Char", "\\u000000") == true); + REQUIRE(exact(g, "Char", "\\u0000000") == false); + REQUIRE(exact(g, "Char", "\\uFFFF") == true); + REQUIRE(exact(g, "Char", "\\u10000") == true); + REQUIRE(exact(g, "Char", "\\u10FFFF") == true); + REQUIRE(exact(g, "Char", "\\u110000") == false); + REQUIRE(exact(g, "Char", "\\uFFFFFF") == false); REQUIRE(exact(g, "Char", "a") == true); REQUIRE(exact(g, "Char", ".") == true); REQUIRE(exact(g, "Char", "0") == true);