Skip to main content

A type-safe applicative parsing library

Project description

functional_parsing_library

A small production non-ready Python library implementing basic applicative parsers. Roughly speaking, these are functions with signature str -> T | CouldNotParse transforming strings into structured data. For example, you might have a function integer which will transform "1" and "-1919" to the integers 1 and -1919, and the string "boink" to CouldNotParse().

What makes these functions useful is that they can be combined with so-called parser combinators. This way, complicated parsers can be gradually built up from smaller, simpler parsers. For example, if we already have parsers nonnegative_integer and negative_integer, the integer parser from earlier could be written as integer = nonnegative_integer | negative_integer, where | should be read as "or". This library implements various such combinators, such as many, some, ignore_left, many_till, and so on.

Another piece of structure that makes these functions useful is that they're functorial: If I have a parser p of type Parser[T] (that is, a function which parses strings to objects of type T), and a function f: T -> S, then f * p will be a parser for objects of type S. For example, take len * many(word('borf')), and try to parse "borfborfborf". Here word('borf') will parse "borf" to the string "borf" (and any other string to CouldNotParse), so the parser many(word('borf') will try and match as many "borf"s as possible and parse our string to the list ['borf', 'borf', 'borf']. The length of this list is 3, so len * many(word('borf')) parses our string to the integer 3.

This works with multi-argument functions as well. If f is a function of type [T, S] -> U, and we have parsers p and q for objects of type T and S, then f * p & q will first try to match p, and if this succeeds it will try and match q, and finally it will apply f.

Another feature of this library is its type safety. Running mypy on

from functional_parsing_library.strings import word


def add_strings(one: str, two: str, three: str) -> int:
    return len(one + two + three)


reveal_type(add_strings * word('hi'))
reveal_type(add_strings * word('hi') & word('hi'))
reveal_type(add_strings * word('hi') & word('hi') & word('di'))

will show that the first parser has type MappedParser[int, str, str], the second MappedParser[int, str], and the third Parser[int]. Expressions like

add_strings * word('hi') & word('hi') & integer

or

add_strings * word('hi') & word('hi') & word('hi') & word('hi')

will raise a TypeError, and mypy will catch this.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

functional_parsing_library-0.0.13.tar.gz (9.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

functional_parsing_library-0.0.13-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file functional_parsing_library-0.0.13.tar.gz.

File metadata

File hashes

Hashes for functional_parsing_library-0.0.13.tar.gz
Algorithm Hash digest
SHA256 311526c180d7d3f142a08bb39f84c9ac7440b890f0d30bc2d57e05e306bcea7c
MD5 8075c7c396b847f15307341470667988
BLAKE2b-256 f691b94a45d4691873fba6de8e445a22a2cbe6287807d7e1800bc62d2914dfee

See more details on using hashes here.

File details

Details for the file functional_parsing_library-0.0.13-py3-none-any.whl.

File metadata

File hashes

Hashes for functional_parsing_library-0.0.13-py3-none-any.whl
Algorithm Hash digest
SHA256 3e278bd8cdd5af176ef95a976cca92e8c7493bfb77aa18fcb72cbe9654888ab9
MD5 f6cc2e4bcf98c9ebd7ab6c114762187d
BLAKE2b-256 729b6d5b5764f0be17a3a1e57db189c47e7b9b69975bfde41673f42686f5e2a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page