Track the
ParserRuleContext objects during the parse and hook
them up using the
ParserRuleContext#children list so that it
forms a parse tree. The
ParserRuleContext returned from the start
rule represents the root of the parse tree.
Note that if we are not building parse trees, rule contexts only point
upwards. When a rule exits, it returns the context but that gets garbage
collected if nobody holds a reference. It points upwards but nobody
points at it.
When we build parse trees, we are adding all of these contexts to
ParserRuleContext#children list. Contexts are then not candidates
for garbage collection.