From 82ed6b55467c94ead3b69cc12e5918c6dcc937f7 Mon Sep 17 00:00:00 2001 From: Brandon Dyck Date: Wed, 2 Apr 2025 14:24:21 -0600 Subject: [PATCH] Regexp: don't return error when match fails at EOF --- bytes/regexp.go | 3 +++ bytes/regexp_test.go | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/bytes/regexp.go b/bytes/regexp.go index 44b2d0e..539406e 100644 --- a/bytes/regexp.go +++ b/bytes/regexp.go @@ -69,6 +69,9 @@ func Regexp(pattern string) gigaparsec.Parser[byte, string] { return gigaparsec.Result[byte, string]{}, fmt.Errorf("Regexp: reader error: %w", err) } if idx == nil { + if err == io.EOF { + return gigaparsec.Fail[byte, string](false, gigaparsec.MessageEnd(input.Pos())), nil + } got := make([]byte, r.Count()) _, _, err = input.Read(got) if err != nil { diff --git a/bytes/regexp_test.go b/bytes/regexp_test.go index 6e409f6..b91f61f 100644 --- a/bytes/regexp_test.go +++ b/bytes/regexp_test.go @@ -69,6 +69,13 @@ func TestRegexp(t *testing.T) { must.True(t, succeeded) must.EqOp(t, "", value) }) + t.Run("fails without an error at EOF", func(t *testing.T) { + p := pbytes.Regexp("a") + result, err := p(gigaparsec.MakeState(strings.NewReader(""))) + succeeded, _, _ := result.Status() + must.NoError(t, err) + must.False(t, succeeded) + }) } func TestRuneReader(t *testing.T) {