From 4e157f7a0e200c4ce304ff32844a53d65c210993 Mon Sep 17 00:00:00 2001 From: Brandon Dyck Date: Wed, 2 Apr 2025 14:06:12 -0600 Subject: [PATCH] Regexp: succeed on empty match at end of input --- bytes/regexp.go | 2 +- bytes/regexp_test.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/bytes/regexp.go b/bytes/regexp.go index 66f6b65..44b2d0e 100644 --- a/bytes/regexp.go +++ b/bytes/regexp.go @@ -80,7 +80,7 @@ func Regexp(pattern string) gigaparsec.Parser[byte, string] { // when searching a RuneReader. dst := make([]byte, idx[1]-idx[0]) n, _, err := input.Read(dst) - if err != nil { + if err != nil && (!errors.Is(err, io.EOF) || n < uint64(len(dst))) { return gigaparsec.Result[byte, string]{}, fmt.Errorf("Regexp: unexpected error: %w", err) } next := input.At(input.Pos() + n) diff --git a/bytes/regexp_test.go b/bytes/regexp_test.go index b8742fc..6e409f6 100644 --- a/bytes/regexp_test.go +++ b/bytes/regexp_test.go @@ -61,6 +61,14 @@ func TestRegexp(t *testing.T) { must.NoError(t, err) test.StrContains(t, result.Message().Got(), "hella") }) + t.Run("succeeds on empty matches", func(t *testing.T) { + p := pbytes.Regexp(".*") + result, err := p(gigaparsec.MakeState(strings.NewReader(""))) + succeeded, value, _ := result.Status() + must.NoError(t, err) + must.True(t, succeeded) + must.EqOp(t, "", value) + }) } func TestRuneReader(t *testing.T) {