Resource Management  The Input Problem  Search and Backtracking
within Lepl is implemented using generators. These are blocks of
code that can be paused and restarted. Each matcher has, at its
core, one of these generators. Backtracking is achieved by
calling the generator to continue searching the input for
alternative matches.  This can be a problem, particularly when
parsing input from files. The parse_file() method calls
parse_iterable() which iterates over the lines in the file. The
streams created by parse_iterable() are lazy linked lists that
only reference later parts of the input. That means that Python
can reclaim (garbage–collect) the memory used by earlier input
while the parser is still matching later input. However, this
cannot happen (memory cannot be freed) if a generator keeps a
reference to earlier input (which it needs in case it is called
to backtrack and provide a new match).  So the generators used
in Lepl to provide backtracking frustrate Python’s garbage
collection and lead to parsers