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 ``` -- https://mail.python.org/mailman/listinfo/python-list