Package

purescript-parsing

Repository
purescript-contrib/purescript-parsing
License
BSD-2-Clause
Uploaded by
jamesdbrock
Published on
2022-01-09T15:54:25Z

CI Release Pursuit Maintainer: jamesdbrock Maintainer: robertdp

A parser combinator library based on Haskell's Parsec.

Installation

Install parsing with Spago:

spago install parsing

Quick start

Here is a basic introduction to monadic parsers.

Parsers

A parser in this library has the type Parser s a, where s the type of the input string, and a is the type of the data which the parser will produce on success. Parser s a is a monad. It’s defined in the module Text.Parsing.Parser.

Monads can be used to provide context for a computation, and that’s how we use them in monadic parsing. The context provided by the Parser monad is our current location in the input string. Parsing starts at the beginning of the input string.

Parsing requires two more capabilities: choice and failure.

We need choice to be able to make decisions about what kind of thing we’re parsing depending on the input which we encouter. This is provided by the Alt typeclass instance of Parser monad, particularly the <|> operator.

We need failure in case the input stream is not parseable. This is provided by the fail function, which calls the throwError function of the MonadThrow typeclass instance of the Parser monad.

Here is the original short classic FUNCTIONAL PEARLS Monadic Parsing in Haskell by Graham Hutton and Erik Meijer. There are lots of other great monadic parsing tutorials on the internet.

Running a parser

To run a parser, call the function runParser in the Text.Parsing.Parser module, and supply it with a parser and an input.

Primitive parsers

Each type of input string needs primitive parsers. Primitive parsers for input string type String are in the Text.Parsing.Parser.String module. We can use these primitive parsers to write other parsers.

Here is a parser which will accept the input string "ab" or the input string "aB", and will return only the 'b' character, whether it’s lowercase or uppercase.

ayebee :: Parser String Char
ayebee = do
  _ <- char 'a'
  b <- char 'b' <|> char 'B'
  pure b

We can run the parser ayebee like so

runParser "aB" ayebee

and then the parser will succeed and return Right 'B'.

More parsers

There are other String parsers in the module Text.Parsing.Parser.Token, for example the parser letter :: Parser String Char which will accept any single alphabetic letter.

Parser combinators

A parser combinator is a function which takes a parser as an argument and returns another parser. The many combinator, for example, will repeat a parser as many time as it can. So the parser many letter will have type Parser String (Array Char). Parser combinators are in this package in the module Text.Parsing.Parser.Combinators.

Related Packages

  • parsing-dataview Provides the module Text.Parsing.Parser.DataView of primitive parsers for binary parsing of ArrayBuffer.

Documentation

parsing documentation is stored in a few places:

  1. Module documentation is published on Pursuit.
  2. Written documentation is kept in the docs directory.
  3. Usage examples can be found in the test suite.

If you get stuck, there are several ways to get help:

Contributing

You can contribute to parsing in several ways:

  1. If you encounter a problem or have a question, please open an issue. We'll do our best to work with you to resolve or answer it.

  2. If you would like to contribute code, tests, or documentation, please read the contributor guide. It's a short, helpful introduction to contributing to this library, including development instructions.

  3. If you have written a library, tutorial, guide, or other resource based on this package, please share it on the PureScript Discourse! Writing libraries and learning resources are a great way to help this library succeed.