From e60f6ae015309c68d3102e50fe19c8eb19dc7519 Mon Sep 17 00:00:00 2001 From: Brandon Dyck Date: Fri, 11 Apr 2025 19:03:45 -0600 Subject: [PATCH] Added Bracket, Where, and Token (without tests) --- bytes/bytes.go | 16 ++++++++++++++++ gigaparsec.go | 15 +++++++++++++++ parser_test.go | 8 ++++++++ 3 files changed, 39 insertions(+) create mode 100644 bytes/bytes.go diff --git a/bytes/bytes.go b/bytes/bytes.go new file mode 100644 index 0000000..79800e5 --- /dev/null +++ b/bytes/bytes.go @@ -0,0 +1,16 @@ +package bytes + +import ( + "git.codemonkeysoftware.net/b/gigaparsec" +) + +func Token[Out, WSOut any](whitespace gigaparsec.Parser[byte, WSOut]) func(p gigaparsec.Parser[byte, Out]) gigaparsec.Parser[byte, Out] { + mappedWS := gigaparsec.Map(whitespace, func(WSOut) struct{} { return struct{}{} }) + var ignoreWS gigaparsec.Parser[byte, struct{}] = func(s gigaparsec.State[byte]) (gigaparsec.Result[byte, struct{}], error) { + result, err := mappedWS(s) + return result.Consume(false), err + } + return func(p gigaparsec.Parser[byte, Out]) gigaparsec.Parser[byte, Out] { + return gigaparsec.Seq2(p, gigaparsec.Repeat(0, ignoreWS), func(val Out, _ []struct{}) Out { return val }) + } +} diff --git a/gigaparsec.go b/gigaparsec.go index 0a2da77..30edffa 100644 --- a/gigaparsec.go +++ b/gigaparsec.go @@ -194,6 +194,17 @@ func (p Parser[In, Out]) Label(label string) Parser[In, Out] { } } +func (p Parser[In, Out]) Where(pred func(Out) bool) Parser[In, Out] { + return func(s State[In]) (Result[In, Out], error) { + result, err := p(s) + if result.success && !pred(result.value) { + result.success = false + result.message.got = "failed Where predicate" + } + return result, err + } +} + type ParseError Message func (pe ParseError) Error() string { @@ -412,3 +423,7 @@ func Lazy[In, Out any](p func() Parser[In, Out]) Parser[In, Out] { return p()(s) } } + +func Bracket[In, Out, LOut, ROut any](left Parser[In, LOut], p Parser[In, Out], right Parser[In, ROut]) Parser[In, Out] { + return Seq3(left, p, right, func(_ LOut, val Out, _ ROut) Out { return val }) +} diff --git a/parser_test.go b/parser_test.go index 70708d0..388b64d 100644 --- a/parser_test.go +++ b/parser_test.go @@ -210,3 +210,11 @@ func TestRepeat(t *testing.T) { test.False(t, succeeded) }) } + +func TestBracket(t *testing.T) { + Todo(t) +} + +func TestWhere(t *testing.T) { + Todo(t) +}