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.