From c35493ea130b2c2f49b42b54aa8e3750bf626471 Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Tue, 18 Sep 2018 15:21:06 +0200 Subject: [PATCH 1/6] Remove implicit space parsing from combinators - `many` and `some` do not implicitly parse spaces any more - use `spacy` to parse spaces around a parser - use `by` to parse items separated by something - use this for the old behaviour: `some_old item == by spaces item` --- src/Parser/Expression.elm | 7 +-- src/Parser/Extra.elm | 112 ++++++++++++++++++++++++++++++++++++++ src/Parser/Extras.elm | 96 -------------------------------- 3 files changed, 114 insertions(+), 101 deletions(-) create mode 100644 src/Parser/Extra.elm delete mode 100644 src/Parser/Extras.elm diff --git a/src/Parser/Expression.elm b/src/Parser/Expression.elm index c8695c5..161759c 100644 --- a/src/Parser/Expression.elm +++ b/src/Parser/Expression.elm @@ -100,7 +100,6 @@ The following would define a simple arithmetic parser. oneOf [ parens <| lazy (\_ -> expr) , int - |. spaces ] expr : Parser Int @@ -225,8 +224,8 @@ makeParser ops term = |= termP |> andThen (\( f, y ) -> oneOf [ ambiguousRight, ambiguousLeft, ambiguousNon, succeed (f x y) ]) in - termP - |> andThen (\x -> oneOf [ rassocP x, lassocP x, nassocP x, succeed x ]) + termP + |> andThen (\x -> oneOf [ rassocP x, lassocP x, nassocP x, succeed x ]) type alias Ops a = @@ -265,11 +264,9 @@ unaryOp : (a -> a) -> Parser () -> Parser (a -> a) unaryOp fn opParser = succeed fn |. opParser - |. spaces binaryOp : (a -> a -> a) -> Parser () -> Parser (a -> a -> a) binaryOp fn opParser = succeed fn |. opParser - |. spaces diff --git a/src/Parser/Extra.elm b/src/Parser/Extra.elm new file mode 100644 index 0000000..09f1407 --- /dev/null +++ b/src/Parser/Extra.elm @@ -0,0 +1,112 @@ +module Parser.Extra + exposing + ( between + , braces + , brackets + , by + , many + , parens + , some + , spacy + ) + +{-| Some convenience parser combinators. + + +# Combinators + +@docs many, some, by, spacy, between, parens, braces, brackets + +-} + +import Parser exposing (..) + + +{-| Apply a parser one or more times and return a list of the results. +-} +some : Parser a -> Parser (List a) +some item = + succeed (::) + |= item + |= many item + + +{-| Apply a parser zero or more times and return a list of the results. +-} +many : Parser a -> Parser (List a) +many item = + let + helper vs = + oneOf + [ succeed (\v -> Loop (v :: vs)) + |= item + , succeed () + |> map (\() -> Done (List.reverse vs)) + ] + in + loop [] helper + + +{-| Parse an item one or more times separated by a separator. +-} +by : Parser () -> Parser a -> Parser (List a) +by sep item = + let + more = + succeed identity + |. backtrackable sep + |= item + in + succeed (::) + |= item + |= many more + + +{-| Parse an item with spaces before and after. +-} +spacy : Parser () -> Parser () +spacy item = + succeed identity + |. spaces + |= item + |. spaces + + +{-| Parse an item between two other parsers. +-} +between : Parser opening -> Parser closing -> Parser a -> Parser a +between opening closing item = + succeed identity + |. opening + |= item + |. closing + + +{-| Parse an expression between parenthesis. + + parens item == between (symbol "(") (symbol ")") item + +-} +parens : Parser a -> Parser a +parens = + between (symbol "(") (symbol ")") + + +{-| Parse an expression between curly braces. + + braces item == between (symbol "{") (symbol "}") item + +-} +braces : Parser a -> Parser a +braces = + between (symbol "{") (symbol "}") + + +{-| Parse an expression between square brackets. + + brackets item == between (symbol "[") (symbol "]") item + +-} +brackets : Parser a -> Parser a +brackets = + between (symbol "[") (symbol "]") diff --git a/src/Parser/Extras.elm b/src/Parser/Extras.elm deleted file mode 100644 index 30b2fac..0000000 --- a/src/Parser/Extras.elm +++ /dev/null @@ -1,96 +0,0 @@ -module Parser.Extras - exposing - ( many - , some - , between - , parens - , braces - , brackets - ) - -{-| Some convenience parser combinators. - - -# Combinators - -@docs many, some, between, parens, braces, brackets - --} - -import Parser exposing (..) -import Tuple - - -{-| Apply a parser zero or more times and return a list of the results. --} -many : Parser a -> Parser (List a) -many p = - loop [] (manyHelp p) - - -{-| Apply a parser one or more times and return a tuple of the first result parsed -and the list of the remaining results. --} -some : Parser a -> Parser ( a, List a ) -some p = - succeed Tuple.pair - |= p - |. spaces - |= many p - - -{-| Parse an expression between two other parsers --} -between : Parser opening -> Parser closing -> Parser a -> Parser a -between opening closing p = - succeed identity - |. opening - |. spaces - |= p - |. spaces - |. closing - - -{-| Parse an expression between parenthesis. - - parens p == between (symbol "(") (symbol ")") p - --} -parens : Parser a -> Parser a -parens = - between (symbol "(") (symbol ")") - - -{-| Parse an expression between curly braces. - - braces p == between (symbol "{") (symbol "}") p - --} -braces : Parser a -> Parser a -braces = - between (symbol "{") (symbol "}") - - -{-| Parse an expression between square brackets. - - brackets p == between (symbol "[") (symbol "]") p - --} -brackets : Parser a -> Parser a -brackets = - between (symbol "[") (symbol "]") - - - --- HELPERS - - -manyHelp : Parser a -> List a -> Parser (Step (List a) (List a)) -manyHelp p vs = - oneOf - [ succeed (\v -> Loop (v :: vs)) - |= p - |. spaces - , succeed () - |> map (\_ -> Done (List.reverse vs)) - ] From 6744d93965467e241907670928a4fd8fb7b6fb65 Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Fri, 21 Sep 2018 09:41:43 +0200 Subject: [PATCH 2/6] Fix type of `spacy` --- src/Parser/Extra.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Parser/Extra.elm b/src/Parser/Extra.elm index 09f1407..80fae3e 100644 --- a/src/Parser/Extra.elm +++ b/src/Parser/Extra.elm @@ -64,7 +64,7 @@ by sep item = {-| Parse an item with spaces before and after. -} -spacy : Parser () -> Parser () +spacy : Parser a -> Parser a spacy item = succeed identity |. spaces From b4e09f95581b59cdfda956e54d5e2dfedcb89175 Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Fri, 21 Sep 2018 09:43:02 +0200 Subject: [PATCH 3/6] Use Nonempty for `some` parser --- elm.json | 5 +++-- src/Parser/Extra.elm | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/elm.json b/elm.json index 82d5bf4..ff2bb09 100644 --- a/elm.json +++ b/elm.json @@ -11,7 +11,8 @@ "elm-version": "0.19.0 <= v < 0.20.0", "dependencies": { "elm/core": "1.0.0 <= v < 2.0.0", - "elm/parser": "1.0.0 <= v < 2.0.0" + "elm/parser": "1.0.0 <= v < 2.0.0", + "mgold/elm-nonempty-list": "4.0.0 <= v < 5.0.0" }, "test-dependencies": {} -} +} \ No newline at end of file diff --git a/src/Parser/Extra.elm b/src/Parser/Extra.elm index 80fae3e..e21d17b 100644 --- a/src/Parser/Extra.elm +++ b/src/Parser/Extra.elm @@ -19,14 +19,15 @@ module Parser.Extra -} +import List.Nonempty as Nonempty exposing (Nonempty(..)) import Parser exposing (..) {-| Apply a parser one or more times and return a list of the results. -} -some : Parser a -> Parser (List a) +some : Parser a -> Parser (Nonempty a) some item = - succeed (::) + succeed Nonempty |= item |= many item From e9244c028fc8e462ff6c454a9f1fc01c2d58980c Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Fri, 21 Sep 2018 14:42:49 +0200 Subject: [PATCH 4/6] Revert "Use Nonempty for `some` parser" This reverts commit b4e09f95581b59cdfda956e54d5e2dfedcb89175. --- elm.json | 5 ++--- src/Parser/Extra.elm | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/elm.json b/elm.json index ff2bb09..82d5bf4 100644 --- a/elm.json +++ b/elm.json @@ -11,8 +11,7 @@ "elm-version": "0.19.0 <= v < 0.20.0", "dependencies": { "elm/core": "1.0.0 <= v < 2.0.0", - "elm/parser": "1.0.0 <= v < 2.0.0", - "mgold/elm-nonempty-list": "4.0.0 <= v < 5.0.0" + "elm/parser": "1.0.0 <= v < 2.0.0" }, "test-dependencies": {} -} \ No newline at end of file +} diff --git a/src/Parser/Extra.elm b/src/Parser/Extra.elm index e21d17b..80fae3e 100644 --- a/src/Parser/Extra.elm +++ b/src/Parser/Extra.elm @@ -19,15 +19,14 @@ module Parser.Extra -} -import List.Nonempty as Nonempty exposing (Nonempty(..)) import Parser exposing (..) {-| Apply a parser one or more times and return a list of the results. -} -some : Parser a -> Parser (Nonempty a) +some : Parser a -> Parser (List a) some item = - succeed Nonempty + succeed (::) |= item |= many item From b6e05bcccd9342ba17a29b6d57181f8238a3295b Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Fri, 21 Sep 2018 14:43:26 +0200 Subject: [PATCH 5/6] Make `some` return a tuple --- src/Parser/Extra.elm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Parser/Extra.elm b/src/Parser/Extra.elm index 80fae3e..e71381a 100644 --- a/src/Parser/Extra.elm +++ b/src/Parser/Extra.elm @@ -24,9 +24,9 @@ import Parser exposing (..) {-| Apply a parser one or more times and return a list of the results. -} -some : Parser a -> Parser (List a) +some : Parser a -> Parser ( a, List a ) some item = - succeed (::) + succeed Tuple.pair |= item |= many item From f56b7bdccdf3350bc63481d963e569f86f6dc5d2 Mon Sep 17 00:00:00 2001 From: Tim Steenvoorden Date: Fri, 21 Sep 2018 14:50:54 +0200 Subject: [PATCH 6/6] rename Extra back to Extras for merge --- src/Parser/{Extra.elm => Extras.elm} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/Parser/{Extra.elm => Extras.elm} (99%) diff --git a/src/Parser/Extra.elm b/src/Parser/Extras.elm similarity index 99% rename from src/Parser/Extra.elm rename to src/Parser/Extras.elm index e71381a..8425d9a 100644 --- a/src/Parser/Extra.elm +++ b/src/Parser/Extras.elm @@ -1,4 +1,4 @@ -module Parser.Extra +module Parser.Extras exposing ( between , braces