In top-down parsing you use each incoming token as a decision point to
determine the next step of the parsing; in bottom-up parsing you group
the incoming tokens together and look for a group that matches one of
the known patterns of the grammar. Then you start grouping groups
together, and when a match is made for the pattern 'program' parsing
is complete. Top down parsing is much easier to implement, but,
bottom-up parsing is more efficient. YACC and other code generators
tend to generate the type of state tables required to do bottom-up
parsing efficiently...