diff options
author | Özgür Kesim <oec@codeblau.de> | 2019-06-18 13:21:21 +0200 |
---|---|---|
committer | Özgür Kesim <oec@codeblau.de> | 2019-06-18 13:21:21 +0200 |
commit | 9bc60a23116a1992e56d3a2754df6523bc565e99 (patch) | |
tree | 923e28f1cc759d1c49668049f9afc2e2ccba7612 | |
parent | b9b0f69ccfe6fa9ef21a9323a77f1c65220d944d (diff) |
applying upstream patch for github.com/vektah/goparsify/issues/3
-rw-r--r-- | combinator.go | 13 | ||||
-rw-r--r-- | combinator_test.go | 11 |
2 files changed, 14 insertions, 10 deletions
diff --git a/combinator.go b/combinator.go index 5b0d584..ae4d31c 100644 --- a/combinator.go +++ b/combinator.go @@ -35,7 +35,6 @@ func NoAutoWS(parser Parserish) Parser { // Any matches the first successful parser and returns its result func Any(parsers ...Parserish) Parser { parserfied := ParsifyAll(parsers...) - // Records which parser was successful for each byte, and will use it first next time. return NewParser("Any()", func(ps *State, node *Result) { ps.WS(ps) @@ -45,13 +44,7 @@ func Any(parsers ...Parserish) Parser { } startpos := ps.Pos - longestError := ps.Error - if ps.Cut <= startpos { - ps.Recover() - } else { - return - } - + var longestError Error for _, parser := range parserfied { parser(ps, node) if ps.Errored() { @@ -72,14 +65,14 @@ func Any(parsers ...Parserish) Parser { }) } -// Some matches one or more parsers and returns the value as .Child[n] +// Some matches zero or more parsers and returns the value as .Child[n] // an optional separator can be provided and that value will be consumed // but not returned. Only one separator can be provided. func Some(parser Parserish, separator ...Parserish) Parser { return NewParser("Some()", manyImpl(0, parser, separator...)) } -// Many matches zero or more parsers and returns the value as .Child[n] +// Many matches one or more parsers and returns the value as .Child[n] // an optional separator can be provided and that value will be consumed // but not returned. Only one separator can be provided. func Many(parser Parserish, separator ...Parserish) Parser { diff --git a/combinator_test.go b/combinator_test.go index b315b37..17a0c11 100644 --- a/combinator_test.go +++ b/combinator_test.go @@ -88,6 +88,17 @@ func TestAny(t *testing.T) { }) }) + + // see https://github.com/vektah/goparsify/issues/3 + t.Run("doesn't succeed early after caller error", func(t *testing.T) { + str := "str" + str1 := Seq("str", "1") + str2 := Any("str2") + p := Any(str1, str2, str) + _, ps := runParser("str", p) + require.False(t, ps.Errored()) + require.Equal(t, "", ps.Get()) + }) } func TestSome(t *testing.T) { |