ANN: parsita 1.0.0, a new parser combinator library

David Hagen davidrhagen at gmail.com
Mon Oct 3 09:00:47 EDT 2016


Parsita is a parser combinator library for Python. I wrote it because I 
missed the intuitive parser combinator library in Scala while trying to 
parse custom model file formats in Python. Parsita is focused on a clean 
grammar-like syntax, defining operators like `|` and `&` and functions like 
`opt` and `repsep`. It even allows for forward declarations of values 
through metaclass magic.

Available on PyPI: 
pip install parsita

Tutorial and examples on Github: 
https://github.com/drhagen/parsita

Obligatory JSON parser example:

```
from parsita import *

json_whitespace = r'[ \t\n\r]*'

class JsonStringParsers(TextParsers, whitespace=None):
    quote = lit(r'\"') > (lambda _: '"')
    reverse_solidus = lit(r'\\') > (lambda _: '\\')
    solidus = lit(r'\/') > (lambda _: '/')
    backspace = lit(r'\b') > (lambda _: '\b')
    form_feed = lit(r'\f') > (lambda _: '\f')
    line_feed = lit(r'\n') > (lambda _: '\n')
    carriage_return = lit(r'\r') > (lambda _: '\r')
    tab = lit(r'\t') > (lambda _: '\t')
    uni = reg(r'\\u([0-9a-fA-F]{4})') > (lambda x: chr(int(x.group(1), 16)))

    escaped = (quote | reverse_solidus | solidus | backspace | form_feed
               | line_feed | carriage_return | tab | uni)
    unescaped = reg(r'[\u0020-\u0021\u0023-\u005B\u005D-\U0010FFFF]+')

    string = '"' >> rep(escaped | unescaped) << '"' > ''.join


class JsonParsers(TextParsers, whitespace=json_whitespace):
    number = reg(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][-+]?[0-9]+)?') > float

    false = lit('false') > (lambda _: False)
    true = lit('true') > (lambda _: True)
    null = lit('null') > (lambda _: None)

    string = reg(json_whitespace) >> JsonStringParsers.string

    array = '[' >> repsep(value, ',') << ']'

    entry = string << ':' & value
    obj = '{' >> repsep(entry, ',') << '}' > dict

    value = number | false | true | null | string | array | obj
```



More information about the Python-list mailing list