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