Handling Ambiguity¶
The parse
function returns a ParseForest
. A ParseForest
is an efficient shared representation of multiple
possible ParseTree
objects. For some grammars, therefore, you must be careful dealing with ParseForest
objects
as they may contains exponentially many possible parses.
single, all, count, and __iter__¶
These are the basic methods for extracting parse trees from the forest.
ParseForest.single()
returns the unique tree in the forest, if there is one, or throws AmbiguousParseError
(see Errors and Edge Cases).
ParseForest.count()
returns a count of all the trees.
ParseForest.all()
returns a list of all the trees in the forest. It can be quite large.
ParseForest.__iter__()
iterates over all the trees in the forest. It is quite a bit slower than all
, but it
doesn’t load all the trees into memory at once.
Greedy Rules¶
Using the greedy
, lazy
, prefer_early
, prefer_late
and penalty
settings described in Greedy Symbols allows you
to eliminate alternative parses. In the extreme case of marking every nonterminal with prefer_early
and
every optional
, star
and plus
symbol with greedy
, then you will never have an ambiguous parse.
Builders¶
Builders are an advanced API that give you fine control over interpreting the parse. You can explicitly
control behaviour in ambiguity by handling Builder.merge()
.