Release History


Date Version Description
2009-01-29 1.0b1 Fighting with setuptools etc.
2009-01-29 1.0b2 Now with source, documentation and inline licence.
2009-01-30 1.0b3 Fixed version number confusion (was 0.1bx in some places).
2009-01-31 1.0rc1 With support.
2009-02-04 1.0 No significant changes from rc1.
2009-02-23 2.0b1 New trampolining core; matcher graph rewriting; memoisation.
2009-03-04 2.0b2 Fixed major bug in LMemo for 2.6; general tidying.
2009-03-05 2.0 Improved documentation.
2009-03-05 2.0.1 Fixed stupid bug introduced at last minute in 2.0.
2009-03-06 2.0.2 A few more small bug fixes.
2009-03-08 2.1b Improved efficiency.
2009-03-08 2.1 Minor bugfixes and documentation.
2009-03-12 2.1.1 Fix flatten() and compose_transforms(); remove GeneratorManager from default configuration.
2009-03-27 2.2 Added >=, String(), regexp framework.
2009-04-05 2.3 Compilation to regular expressions.
2009-04-05 2.3.1 Fix regexp packaging.
2009-04-05 2.3.2 Fix regexp packaging.
2009-04-28 2.3.3 Fix regexp packaging.
2009-04-28 2.3.4 Fix regexp packaging.
2009-04-28 2.3.5 Make all classes new style in 2.6.
2009-05-02 2.4 Added lexer.
2009-06-27 3.0a1 New tutorial; bin package; modified Nodes, *args (general clean-up of API).
2009-07-04 3.0a2 Various small fixes via pylint.
2009-07-07 3.0b1 Smart separators.
2009-07-07 3.0b2 Fix packaging issues with b1.
2009-07-16 3.0b3 More packaging issues (switched to distutils; bundling tests and examples).
2009-07-16 3.0 New tutorial; bin package; smart separators; modified Nodes, *args (general clean-up of API).
2009-08-19 3.1 Rewritten streams.
2009-09-05 3.2 Clone bugfix.
2009-09-09 3.2.1 Clone bugfix bugfix.
2009-09-13 3.3b1 Whitespace sensitive parsing (no documentation).
2009-09-23 3.3 Whitespace sensitive parsing.
2009-11-22 3.3.1 Regexp bugfixes.
2009-11-22 3.3.2 Regexp bugfixes (correct self-test).
2009-12-10 3.3.3 Various small tweaks based on user feedback.
2010-04-03 4.0b1 Broad revision, simplification.
2010-04-16 4.0 Broad revision, simplification.
2010-04-18 4.0.1 Small bugfix for left-recursive, whitespace sensitive grammars (hash).
2010-04-18 4.0.2 Small bugfix for left-recursive, whitespace sensitive grammars (equality).
2010-04-20 4.0.3 Small bugfix for kargs of user-defined matchers; dropped Python 3 specific test.
2010-04-24 4.1 Major bugfix related to coercion of matcher arguments.
2010-05-02 4.2 RFC 3696 validation; better regexp rewriting.
2010-05-02 4.2.1 Small bugfix for top level DNS names that start with a digit.
2010-05-20 4.2.2 Small bugfix in regexp rewriting.
2010-05-31 4.2.3 Extra offside example; improved handling of regexps in tokens.
2010-06-10 4.3 Simplified line aware parsing.
2010-06-11 4.3.1 Small bugfix to support SOL and EOL.
2010-06-11 4.3.2 Small bugfix to support Python 2.7.
2010-10-12 4.3.3 Bugfixes for offside handling of errors.
2010-11-28 4.3.4 Small bugfix for printing empty List.
2011-01-25 4.3.5 Bugfix for NFA regexps with multiple choices; add Rational() matchers.
2011-01-30 4.4 Rename Float(), Real(); add Limit().
2011-03-20 5.0 Rewrite of streams and related functionality. Simplified core code.
2012-01-08 5.0.1 Tokens + iterables bugfix.
2012-03-17 5.0.2 Made String() more string-specific.
2012-03-18 5.1 Add Reduce() (makes String() more general again).
2012-04-07 5.1.1 Added lepl.core.dynamic.IntVar.
2012-05-13 5.1.2 Remove memoization from RFC3696 app to avoid memory leaks.
2012-06-09 5.1.3 Updated docs to indicate end of life. :o(


The addition of Reduce simplified String and resolved some long-standing issues about empty sequences.


See Lepl 5 - Better Shape for the Future.

Stream handling and line–aware parsing were simplified. Resource management was improved.


The Float() matcher now excludes integers. For the old behaviour, which included them, use Real(). More control over search has been added with Limit().

4.3, 4.3.5

After user feedback the line-aware (but not offside) parsing was simplified slightly. Eol() was changed to LineAwareEol(), a similar matcher for start of line was added, and rewriting of matchers inside tokens was improved.

The bug fixed in 4.3.5 may have affected some complex character-set matches (like floating point numbers). It is unlikely to have been common, since regular expression compilation is restricted to “leaf” matchers, which are not normally so complex.

4.2, 4.2.3

Includes a new module for validating email addresses and URLs according to RFC 3696 - Email and URL Validation. Rewriting to regular expressions has also been improved.

4.0, 4.1

See Lepl 4 - Simpler, Faster, Easier.

4.1 addresses a significant error which could cause problems during optimisation of the parser (even with the default configuration).

3.3, 3.3.3

This supports line–aware parsing. 3.3.3 includes various small improvements based on user-feedback.

3.2, 3.2.1

A bugfix release to correct a problem with cloning matchers. 3.2 is a minor release (rather than a 3.1.1 bugfix release) because it also includes significant internal changes as I work towards supporting whitespace-significant (“offside rule”) parsing.


A fairly small set of changes, focussed on the streams that can be used to “wrap” input (instead of parsing a string or list directly). These have a clearer design (although remain, unfortunately, complex), are better documented, with clearer interfaces (abstract classes), and will (I hope) support handling the “offside rule” in a later release.


Although this is a minor release, some of the “public” has API changed. These changes are generally in areas that I believe are not commonly used, but you should check that code still runs after upgrading. Perhaps the most likely problem is that parse_list() has become parse_items() to emphasise that it is for sequences of “characters” (in contrast, for example, to parse a list of “lines”, use parse_lines(); characters and lines refer to whether Any() should match all or part of an entity, respectively).


This release is based on two quite separate themes, both of which have required modifications to the Lepl core code to the extent that a new major version is necessary.

First, the handling of whitespace has been revised, extended, and documented. The preferred approach in most cases, using the Lexer, is described in detail in a new tutorial. In addition, for those cases where spaces are significant, columns and two new “smart separators” have been added.

The separator work highlighted a source of confusion in the standard matchers: many used & and [], which are modified by separators. As a consequence, the library was revised to remove all these uses. Separators should now only affect spaces in a clearly predictable way (there is a small trade-off between usefulness and predictability; the library is now more predictable, which is probably for the best).

The second theme is the parsing of binary data. This is somewhat obscure, but provides some fairly original functionality (with room for significant expansion in future releases).

While writing the binary parser I needed to revisit and revise core routines related to graphs. Various internal interfaces have been simplified; the most visible being the Node() class, which is now more “Pythonesque”.

Table Of Contents

Previous topic

Download And Installation

Next topic


This Page