gren-parse
Basic building blocks for the construction of combinatory parsers
Example
Here is a parser for booleans
import StringParser.Parse as Parse
parseBool =
Parse.oneOf
[ Parse.string "false" |> Parse.map ( \ _ -> [ False ] )
, Parse.string "true" |> Parse.map ( \ _ -> [ True ] )
]
> Parse.run parseBool "true"
Just True
> Parse.run parseBool "false"
Just False
> Parse.run parseBool "asdf"
Nothing
Usage
Use StringParser.Parse to construct parsers that operate directly on String input.
Advanced parsers first break down their input into a sequence of tokens.
This is called tokenization.
You can use StringParser.Parse for this tokenization step.
Then use ArrayParser.Parse to further process the tokenized input.
Don't worry about tokenization if you're not sure you need it.
Being able to omit tokenization is a great advantage in combinatory parsing.
So start with StringParser.Parse if you are new to parser construction.
This will get you a long way.
I have written a complete and correct but somewhat inefficient JSON parser this way.
Sooner or later you will probably realize by yourself that you have to tokenize for certain parsing challenges.
I realized that I needed this when I wanted to improve the efficiency of my JSON parser.
Documentation
packages.gren-lang.org/package/aramiscd/gren-parse
See aramiscd/gren-json for a JSON parser based on this.
See https://vimeo.com/171704565 for an introduction to combinatory parsing.