From 57ab99d816e3f06d2d8f6bec91a87459946a2d14 Mon Sep 17 00:00:00 2001 From: Tom Catshoek Date: Tue, 19 Mar 2024 18:21:59 +0100 Subject: [PATCH] Make abbadingo parser more tolerant of trailing whitespace --- .../input/parsers/grammar/abbadingoheader.h | 4 +++- .../input/parsers/grammar/abbadingosymbol.h | 3 ++- tests/testabbadingoparser.cpp | 20 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/source/input/parsers/grammar/abbadingoheader.h b/source/input/parsers/grammar/abbadingoheader.h index 9a15184..e51cdc4 100644 --- a/source/input/parsers/grammar/abbadingoheader.h +++ b/source/input/parsers/grammar/abbadingoheader.h @@ -137,7 +137,9 @@ namespace { // The complete abbadingo header: number:dsft/name1,... number:dsft/name2,... struct abbadingo_header_p { - static constexpr auto rule = dsl::twice(dsl::p, dsl::trailing_sep(dsl::ascii::space)) + (dsl::newline | dsl::eof); + static constexpr auto rule = dsl::twice(dsl::p, dsl::trailing_sep(dsl::ascii::space)) + + dsl::whitespace(dsl::ascii::blank) + + (dsl::newline | dsl::eof); static constexpr auto value = lexy::construct; }; } diff --git a/source/input/parsers/grammar/abbadingosymbol.h b/source/input/parsers/grammar/abbadingosymbol.h index 041efbc..9a5446d 100644 --- a/source/input/parsers/grammar/abbadingosymbol.h +++ b/source/input/parsers/grammar/abbadingosymbol.h @@ -183,7 +183,7 @@ namespace { }; struct symbol_list { - static constexpr auto rule = dsl::list(dsl::p, dsl::sep(dsl::ascii::space)); + static constexpr auto rule = dsl::list(dsl::peek(dsl::p) >> dsl::p, dsl::trailing_sep(dsl::ascii::blank)); static constexpr auto value = lexy::as_list>; }; @@ -193,6 +193,7 @@ namespace { }; struct abbadingo_trace { + static constexpr auto rule = [] { auto trace_info_part = dsl::p + ws + dsl::p; auto symbol_list_part = ws + dsl::p; diff --git a/tests/testabbadingoparser.cpp b/tests/testabbadingoparser.cpp index 1d9d94b..c8106bb 100644 --- a/tests/testabbadingoparser.cpp +++ b/tests/testabbadingoparser.cpp @@ -87,6 +87,13 @@ TEST_CASE("abbadingo header parser: whole thing", "[parsing]") { std::cout << "value: " << value << "\n"; } +TEST_CASE("abbadingo header parser: trailing whitespace", "[parsing]") { + auto input = lexy::zstring_input("50:ds/name1,ft/name2 8:d/n1,f/n2 "); + auto result = lexy::parse(input, lexy_ext::report_error); + REQUIRE(result); + auto value = result.value(); +} + TEST_CASE("abbadingo symbol parser", "[parsing]") { auto input = lexy::zstring_input("10.1"); auto result = lexy::parse(input, lexy_ext::report_error); @@ -378,4 +385,17 @@ TEST_CASE("abbadingo_parser: add single trace", "[parsing]") { REQUIRE(traces.size() == 1); REQUIRE(traces.at(0)->to_string() == "0 3 a b c"); +} + +TEST_CASE("abbadingo trace parser - trailing whitespace", "[parsing]") { + auto input = lexy::zstring_input("label 3 a b c "); + auto result = lexy::parse(input, lexy_ext::report_error); + REQUIRE(result.has_value()); + auto value = result.value(); + REQUIRE(value.label == "label"); + REQUIRE(value.trace_info.number == 3); + REQUIRE(value.symbols.size() == 3); + REQUIRE(value.symbols.at(0).name == "a"); + REQUIRE(value.symbols.at(1).name == "b"); + REQUIRE(value.symbols.at(2).name == "c"); } \ No newline at end of file