diff --git a/combinator.go b/combinator.go index b6b888b..ea75589 100644 --- a/combinator.go +++ b/combinator.go @@ -2,6 +2,7 @@ package goparsify import ( "bytes" + "strings" ) // Seq matches all of the given parsers in order and returns their result as .Child[n] @@ -51,11 +52,13 @@ func Any(parsers ...Parserish) Parser { startpos := ps.Pos var longestError Error + expected := []string{} for _, parser := range parserfied { parser(ps, node) if ps.Errored() { if ps.Error.pos >= longestError.pos { longestError = ps.Error + expected = append(expected, ps.Error.expected) } if ps.Cut > startpos { break @@ -68,7 +71,10 @@ func Any(parsers ...Parserish) Parser { return } - ps.Error = longestError + ps.Error = Error{ + pos: longestError.pos, + expected: strings.Join(expected, " or "), + } ps.Pos = startpos }) } diff --git a/combinator_test.go b/combinator_test.go index 17a0c11..7b1be68 100644 --- a/combinator_test.go +++ b/combinator_test.go @@ -3,7 +3,6 @@ package goparsify import ( "testing" - "fmt" "os" "github.com/stretchr/testify/require" @@ -54,7 +53,7 @@ func TestAny(t *testing.T) { Seq("hello", "world", "."), Seq("hello", "brother"), )) - require.Equal(t, "offset 11: expected .", p2.Error.Error()) + require.Equal(t, "offset 11: expected nope or .", p2.Error.Error()) require.Equal(t, 11, p2.Error.Pos()) require.Equal(t, 0, p2.Pos) }) @@ -80,8 +79,6 @@ func TestAny(t *testing.T) { t.Run("ab a", func(t *testing.T) { node, ps := runParser("ab a", p) - fmt.Println(node) - require.False(t, ps.Errored()) require.Equal(t, "ab", node.Child[0].Token) require.Equal(t, "a", node.Child[1].Token)