Skip to content
Yet another PEG parser combinator library
Python
Find file
Latest commit 5c651f3 @darius more readme
Failed to load latest commit information.
.gitignore Initial commit
README.md more readme
eg_basic.py add Oberon-0 syntax-error & BASIC tests
eg_calc.py change to the more-traditional '!' syntax for negation, giving up on …
eg_json.py change to the more-traditional '!' syntax for negation, giving up on …
eg_metapeg.py change to the more-traditional '!' syntax for negation, giving up on …
eg_misc.py change to the more-traditional '!' syntax for negation, giving up on …
eg_mutagen_from_js.py change to the more-traditional '!' syntax for negation, giving up on …
eg_oberon0.py change to the more-traditional '!' syntax for negation, giving up on …
eg_pother.py change to the more-traditional '!' syntax for negation, giving up on …
eg_precedence.py change to the more-traditional '!' syntax for negation, giving up on …
eg_regex.py change to the more-traditional '!' syntax for negation, giving up on …
eg_trees.py rename file
eg_wc.py tweak tests
parson.py change to the more-traditional '!' syntax for negation, giving up on …
peg.py formatting
peglet_to_parson.py change to the more-traditional '!' syntax for negation, giving up on …
pegvm.py compile to a little vm
setup.py add setup.py
treepeg.py fix: chain(x, succeed) should always == x

README.md

parson

Yet another PEG parser combinator library in Python. Selling points:

  • The optional concrete syntax for grammars incorporates semantic actions in a concise host-language-independent way. A Parson grammar won't tie you to Python.

  • Whole grammars can be analyzed and compiled, even if built at runtime using combinators. (Contrast with a monadic library, where this is uncomputable.)

  • Semantic actions take and return values in a kind of point-free style.

  • You can use the concrete syntax with about as little ceremony as re.match.

  • You can parse non-string sequences.

Anti-selling points:

  • This library's in fluid design still, undocumented, utterly untuned, etc. I'd like you to use it if you think you might give feedback on the design; otherwise, no promises.

  • Semantic actions work in a nontraditional way that may remind you of Forth and which I haven't yet tried to make play well in typed languages like Haskell. It's concise and just right for parsing, but maybe in the end it'll turn out too cute and make me rip it out if I want this to be used.

  • I don't intend to make grammars work in other host languages before the design settles. (I have done this a bit for the Peglet library, a more basic and settled expression of the same approach to actions: it has Python and JavaScript ports.)

I guess the most similar library out there is LPEG, and that's way way more polished.

Examples

For now, see all the eg_whatever.py files here. eg_calc.py, eg_misc.py, eg_wc.py, and eg_regex.py have the smallest ones. eg_trees.py shows parsing of tree structures, OMeta-style. Other examples include programming languages and other somewhat-bigger stuff.

Basic things still to explain:

  • grammar syntax
  • combinators
  • recursion with combinators
  • actions

Examples of where I'm using it for more than examples:

Something went wrong with that request. Please try again.