of 140
7/30/2019 041 Bottom Up Parsing
1/140
Bottom-UpParsing
7/30/2019 041 Bottom Up Parsing
2/140
What is Bottom-Up Parsing?
Idea: Apply productions in reverse to convertthe user's program to the start symbol.
As with top-down, could be done with a DFS or
BFS, though this is rarely done in practice. We'll be exploring fourdirectional, predictive
bottom-up parsing techniques:
Directional: Scan the input from left-to-right. Predictive: Guess which production should be
inverted.
7/30/2019 041 Bottom Up Parsing
3/140
Bottoms Up!
7/30/2019 041 Bottom Up Parsing
4/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
7/30/2019 041 Bottom Up Parsing
5/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
7/30/2019 041 Bottom Up Parsing
6/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
7/30/2019 041 Bottom Up Parsing
7/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
7/30/2019 041 Bottom Up Parsing
8/140
7/30/2019 041 Bottom Up Parsing
9/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
7/30/2019 041 Bottom Up Parsing
10/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
7/30/2019 041 Bottom Up Parsing
11/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
T
7/30/2019 041 Bottom Up Parsing
12/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
T
E
7/30/2019 041 Bottom Up Parsing
13/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
T
E
T
7/30/2019 041 Bottom Up Parsing
14/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
T
E
T
E
7/30/2019 041 Bottom Up Parsing
15/140
One View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
T
E
T
E
T
E
T
E
T
E
S
7/30/2019 041 Bottom Up Parsing
16/140
A Second View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $
7/30/2019 041 Bottom Up Parsing
17/140
A Second View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $+ ( int + int + int ) $T
7/30/2019 041 Bottom Up Parsing
18/140
A Second View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $+ ( int + int + int ) $T+ ( int + int + int ) $E
7/30/2019 041 Bottom Up Parsing
19/140
A Second View of a Bottom-Up Parse
S E$E TE E + TT int
T (E)
int + ( int + int + int ) $+ ( int + int + int ) $T+ ( int + int + int ) $E+ ( + int + int ) $E T
7/30/2019 041 Bottom Up Parsing
20/140
7/30/2019 041 Bottom Up Parsing
21/140
7/30/2019 041 Bottom Up Parsing
22/140
7/30/2019 041 Bottom Up Parsing
23/140
7/30/2019 041 Bottom Up Parsing
24/140
7/30/2019 041 Bottom Up Parsing
25/140
7/30/2019 041 Bottom Up Parsing
26/140
7/30/2019 041 Bottom Up Parsing
27/140
7/30/2019 041 Bottom Up Parsing
28/140
7/30/2019 041 Bottom Up Parsing
29/140
A left-to-right, bottom-up parse is a rightmost
derivation traced in reverse.
7/30/2019 041 Bottom Up Parsing
30/140
A Third View of a Bottom-Up Parse
int
S
$E
+E T
( )E
+E T
int+E T
intT
int
T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
31/140
A Third View of a Bottom-Up Parse
int
S
$E
+E T
( )E
+E T
int+E T
intT
int
T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
32/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int+E T
intT
int
T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
33/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int+E T
intT
int
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
34/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int+E T
intT
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
35/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int+E T
int
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
36/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int+E T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
37/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
38/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
+E T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
39/140
A Third View of a Bottom-Up ParseS
$E
+E T
( )E
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
7/30/2019 041 Bottom Up Parsing
40/140
A Third View of a Bottom-Up ParseS
$E
+E T
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
A Thi d Vi f B tt U P
7/30/2019 041 Bottom Up Parsing
41/140
A Third View of a Bottom-Up ParseS
$E
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
A Thi d Vi f B tt U P
7/30/2019 041 Bottom Up Parsing
42/140
A Third View of a Bottom-Up ParseS
int + ( int + int + int ) $
int + (int + int + int) $
T + (int + int + int) $E + (int + int + int) $E + (T + int + int) $E + (E + int + int) $E + (E + T + int) $
E + (E + int) $E + (E + T) $E + (E) $E + T $E $
S
H dl
7/30/2019 041 Bottom Up Parsing
43/140
Handles
A reduction transforms uwv to uAv if A w is aproduction.
A handle of a sentential form x ia a substring wanda production A wwhere reducing.
uwv uAv
allows the start symbol to be reached from uAv.
Informally, a production we can reverse without
getting stuck. A left-to-right, bottom-up parse always prunes the
leftmost handle.
A D t il b t H dl
7/30/2019 041 Bottom Up Parsing
44/140
A Detail about Handles
S E$E FE E + FF F * TF TT intT (E)
int + int * int $
A D t il b t H dl
7/30/2019 041 Bottom Up Parsing
45/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
46/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
F
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
47/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
F
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
48/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
49/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F F
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
50/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F F
E
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
51/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F F
E
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
52/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F F
E
This reduction
wasn't a handle!
A Detail about Handles
7/30/2019 041 Bottom Up Parsing
53/140
A Detail about Handles
S E$E FE E + FF F * TF T
T intT (E)
int + int * int $
T
E
T
F F
E
This reduction
wasn't a handle!
I LIED!
7/30/2019 041 Bottom Up Parsing
54/140
The leftmost reduction isn't
always the leftmost handle.
Finding Handles
7/30/2019 041 Bottom Up Parsing
55/140
Finding Handles
Where do we look for handles? What parts of the string might have a handle in it?
How do we search for handles?
What algorithm do we use to try to discover a handle? How do we recognize handles?
Once we've found a possible handle, how do weconfirm that it's correct?
The first two questions have definitiveanswers.
7/30/2019 041 Bottom Up Parsing
56/140
Question One:
Where are handles?
7/30/2019 041 Bottom Up Parsing
57/140
Right here...
Where can we find handles?
7/30/2019 041 Bottom Up Parsing
58/140
Where can we find handles?
Recall: left-to-right, bottom-up parse is arightmost derivation traced in reverse.
Suppose that our current form is uvwand thehandle is A v.
Then after reducing the handle, we get uAw.
Can wcontain any nonterminals?
No: Otherwise we would have reduced ahandle somewhere in w.
Shift/Reduce Parsing
7/30/2019 041 Bottom Up Parsing
59/140
Shift/Reduce Parsing
Idea: Split the input into two parts: Left substring is our work area.
Right substring is input we have not yet processed.
All handles are reduced in the left substring. Right substring consists only of terminals.
At each point, decide whether to:
Move a terminal across the split (shift) Reduce a handle (reduce)
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
60/140
A Sample Shift/Reduce Parse
S E$E F
E E + FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E + FF F * TF TT intT (E)
$int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
61/140
Sa p e S / educe a se
S E$E F
E E + FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E + FF F * TF TT intT (E)
int
$int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
62/140
p
S E$E F
E E + FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E + FF F * TF TT intT (E) T
int
T $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
63/140
p
S E$E F
E E + FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E + FF F * TF TT intT (E) T
int
F
F $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
64/140
p
S E$E F
E E+
FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E + FF F * TF TT intT (E) T
int
F
E
E $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
65/140
p
S E$E F
E E+
FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E+
FF F * TF TT intT (E) T
int
F
E
+
E $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
66/140
p
S E$E F
E E+
FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E+
FF F * TF TT intT (E) T
int
F
E
+ int
E $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
67/140
S E$E F
E E+
FF T * FF TT intT (E)
+ int * int +int
S E$E F
E E+
FF F * TF TT intT (E) T
int
F
E
+ int
T
E $intT
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
68/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
+ int
T
F
E $intF
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
69/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
+ int *
T
F
E $intF
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
70/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
+ int * int
T
F
E $intF
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
71/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
+ int * int
T
F
T
E $intF T
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
72/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
+ int * int
T
F
T
F
E $intF
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
73/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ int * int
T
F
T
F
E $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
74/140
S E$E FE E + FF T * FF TT intT (E)
+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ int * int +
T
F
T
F
E $int
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
75/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int +
T
F
T
F
E $
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
76/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int +
T
F
T
F
T
E $T
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
77/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int +
T
F
T
F
T
F
E $F
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
78/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int +int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int +
T
F
T
F
T
F
E
E $
A Sample Shift/Reduce Parse
7/30/2019 041 Bottom Up Parsing
79/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int $+int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int $+
T
F
T
F
T
F
E
E
A Sample Shift/Reduce Parse
S
7/30/2019 041 Bottom Up Parsing
80/140
S E$E FE E + FF T * FF TT intT (E)
int+ int * int $+int
S E$E FE E + FF F * TF TT intT (E) T
int
F
E
E
+ intint * int $+
T
F
T
F
T
F
E
S
S
An Important Observation
7/30/2019 041 Bottom Up Parsing
81/140
All of the reductions we applied were to the far right end of theleft area.
This is not a coincidence!
No matter what grammar we use, this will be true.
Proof sketch: by induction on the number of reduces After no reduces, the first reduction can be done at the right end of
the left area.
After at least one reduce, the very right of the left area is anonterminal. This nonterminal must be part of the next reduction,
since we're tracing a rightmost derivation backwards.
An Important Corollary
7/30/2019 041 Bottom Up Parsing
82/140
Since reductions are always at the right side ofthe left area, we never need to shift from theleft to the right.
Why?
No need to uncover something to do a reduction.
Consequently, shift/reduce parsing means
Shift: Move a terminal from the right to the left area.
Reduce: Replace some number of symbols at theright side of the left area.
Simplifying our Terminology
7/30/2019 041 Bottom Up Parsing
83/140
All activity in a shift/reduce parser is at the farright end of the left area.
Idea: Represent the left area as a stack.
Shift: Push the next terminal onto the stack. Reduce: Pop some number of symbols from
the stack, then push the appropriatenonterminal.
Finding Handles
7/30/2019 041 Bottom Up Parsing
84/140
Where do we look for handles? At the top of the stack.
How do we search for handles?
What algorithm do we use to try to discover ahandle?
How do we recognize handles?
Once we've found a possible handle, how do we
confirm that it's correct?
7/30/2019 041 Bottom Up Parsing
85/140
Question Two:
How do we search for handles?
Searching for Handles
7/30/2019 041 Bottom Up Parsing
86/140
When using a shift/reduce parser, we mustdecide whether to shift or reduce at each point.
We only want to reduce when we know wehave a handle.
Question: How can we tell that we might belooking at a handle?
Viable Prefixes
7/30/2019 041 Bottom Up Parsing
87/140
A viable prefix is a stringw
such that, for somev, w | v is a legal configuration in a shift/reduceparser.
In other words, a viable prefix is
a string of terminals and nonterminals,
that does not extend past a handle,
that can be completed with terminals into a
sentential form.
Why Care about Viable Prefixes?
7/30/2019 041 Bottom Up Parsing
88/140
As long as the stack contains a viable prefix,we can always extend what we have.
Leads to a nave parsing algorithm:
Shift if doing so leaves the stack containing aviable prefix.
Otherwise, reduce if we have found a handle anderrorif the input is malformed.
Critical Fact
7/30/2019 041 Bottom Up Parsing
89/140
The set of viable prefixes for anygrammar is a regular language.
Critical Fact
7/30/2019 041 Bottom Up Parsing
90/140
The set of viable prefixes for anygrammar is a regular language.
This is a nontrivial result!
Viable Prefixes are Regular: Intuition
7/30/2019 041 Bottom Up Parsing
91/140
Intuition: Unbounded memory makes somecontext-free languages not regular.
For example: balanced parentheses.
A viable prefix does not contain any completeproductions. If it did, one would be a handle and we could
reduce it.
Consequently, we can't use any of thatmemory.
Viable Prefixes are Regular: Intuition
7/30/2019 041 Bottom Up Parsing
92/140
A viable prefix is the concatenation of severalpartial productions.
Keep track ofwhich productions and where weare in those productions.
Finitely many places you can be in a particularproduction.
Finitely many different productions to choose ateach point.
Build an automaton to track the currentproduction and current position.
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
93/140
S E$E TE E + TT intT (E)
int+ int * int $+intint + )( int + $int
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
94/140
S E$E TE E + TT intT (E)
int+ int * int $+intint + )( int + $int
S E$
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
95/140
S E$E TE E + TT intT (E)
int+ int * int $+intint + )( int + $int
S E$E E + T
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
96/140
S E$E TE E + TT intT (E)
int+ int * int $+intint + )( int + $int
S E$E E + T
E T
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
97/140
S E$E TE E + TT intT (E)
int+ int * int $+intint + )( int + $int
S E$E E + T
E T
T int
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
98/140
S E$
E TE E + TT intT (E)
int+ int * int $+int + )( int + $int
S E$E E + T
E T
T int
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
99/140
S E$
E TE E + TT intT (E)
int+ int * int $+int + )( int + $int
S E$E E + T
E T
T int
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
100/140
S E$
E TE E + TT intT (E)
int+ int * int $+T + )( int + $int
S E$
E E + T
E T
T int
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
101/140
S E$
E TE E + TT intT (E)
int+ int * int $+T + )( int + $int
S E$
E E + T
E T
Tracking our Position in Productions
7/30/2019 041 Bottom Up Parsing
102/140
S E$E TE E + TT intT (E)
int+ int * int $+E + )( int + $int
S E$
E E + T
E T
Tracking our Position in Productions
S E
$
7/30/2019 041 Bottom Up Parsing
103/140
S E$E TE E + TT intT (E)
int+ int * int $+E + )( int + $int
S E$
E E + T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
104/140
S E$E TE E + TT intT (E)
intint * int $+E + )( int + $int
S E$
E E + T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
105/140
S E$E TE E + TT intT (E)
intint * int $+E + )( int + $int
S E$
E E + T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
106/140
S E$E TE E + TT intT (E)
intint * int $+E + )( int + $int
S E$
E E + T
T (E)
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
107/140
S E$E TE E + TT intT (E)
int* int $+E + )( int + $int
S E$
E E + T
T (E)
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
108/140
S E$E TE E + TT intT (E)
int* int $+E + )( int + $int
S E$
E E + T
T ( E)
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
109/140
S E$E TE E + TT intT (E)
int* int $+E + )( int + $int
S E$
E E + T
T ( E)
E E + T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
110/140
S E$E TE E + TT intT (E)
int* int $+E + )( int + $int
S E$
E E + T
T ( E)
E E + T
E T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
111/140
S E$E TE E + TT intT (E)
int* int $+E + )( int + $int
S E$
E E + T
T ( E)
E E + T
E TT int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
112/140
S E$E TE E + TT intT (E)
intint $+E + )( int + $int
S E$
E E + T
T ( E)
E E + T
E TT int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
113/140
S E$E TE E + TT intT (E)
intint $+E + )( int + $int
S E$
E E + T
T ( E)
E E + T
E TT int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
114/140
S E$E TE E + TT intT (E)
intint $+E + )( + $int
S E$
E E + T
T ( E)
E E + T
E TT int
T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
115/140
$
E TE E + TT intT (E)
intint $+E + )( + $int
$
E E + T
T ( E)
E E + T
E T
T
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
116/140
$
E TE E + TT intT (E)
intint $+E + )( + $int
$
E E + T
T ( E)
E E + T
E T
E
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
117/140
E TE E + TT intT (E)
intint $+E + )( + $int
E E + T
T ( E)
E E + T
E
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
118/140
E TE E + TT intT (E)
intint $+E + )( + $int
E E + T
T ( E)
E E + T
E
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
119/140
E TE E + TT intT (E)
int $+E + )( + $int
E E + T
T ( E)
E E + T
E
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
120/140
E TE E + TT intT (E)
int $+E + )( + $int
E E + T
T ( E)
E E + T
E
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
121/140
E TE E + TT intT (E)
int $+E
+ )( + $int
E E + T
T ( E)
E E + T
E
T int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
122/140
E TE E + TT intT (E)
int $E
+ )( + $int
E E + T
T ( E)
E E + T
E
T int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
123/140
E TE E + TT intT (E)
int $E
+ )( + $int
E E + T
T ( E)
E E + T
E
T int
Tracking our Position in Productions
S E$
S E$
7/30/2019 041 Bottom Up Parsing
124/140
E TE E + TT intT (E)
int $E
+ )( + $
E E + T
T ( E)
E E + T
E
T int
T
Tracking our Position in Productions
S E$
E T
S E$
7/30/2019 041 Bottom Up Parsing
125/140
E TE E + TT intT (E)
int $E
+ )( + $
E E + T
T ( E)
E E + T
E T
Tracking our Position in Productions
S E$
E T
S E$
7/30/2019 041 Bottom Up Parsing
126/140
E TE E + TT intT (E)
int $E
+ )( + $
E E + T
T ( E)
E E + T
E T
Tracking our Position in Productions
S E$
E T
S E$
7/30/2019 041 Bottom Up Parsing
127/140
E TE E + TT intT (E)
int $E
+ )( $
E E + T
T ( E)
E E + T
E
Tracking our Position in Productions
S E$
E T
S E$
E E T
7/30/2019 041 Bottom Up Parsing
128/140
E TE E + TT intT (E)
int $E
+ )( $
E E + T
T ( E)
E
Tracking our Position in Productions
S E$
E T
S E$
E E T
7/30/2019 041 Bottom Up Parsing
129/140
E TE E + TT intT (E)
int $E
+ )( $
E E + T
T ( E )
E
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
130/140
E TE E + TT intT (E)
$E + )( $
E E + T
T ( E )
E
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
131/140
E TE E + TT intT (E)
$E + )( $
E E + T
T ( E )
E
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
132/140
E TE E + TT intT (E)
$E + $
E E + T
T ( E )
T
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
133/140
E TE E + TT intT (E)
$E + $
E E + T
T
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
134/140
E TE E + TT intT (E)
$E + $
E E + T
T
Tracking our Position in Productions
S E$
E T
S E$
E E + T
7/30/2019 041 Bottom Up Parsing
135/140
E TE E + TT intT (E)
$E $
E E + T
Tracking our Position in Productions
S E$
E T
S E$
7/30/2019 041 Bottom Up Parsing
136/140
E TE E + TT intT (E)
$E $
Tracking our Position in Productions
S E$
E T
S E $
7/30/2019 041 Bottom Up Parsing
137/140
E TE E + TT intT (E)
$E $
Tracking our Position in Productions
S E$
E T
S E $
7/30/2019 041 Bottom Up Parsing
138/140
E TE E + TT intT (E)
E $
Tracking our Position in Productions
S E$
E T
S E $
7/30/2019 041 Bottom Up Parsing
139/140
E TE E + TT intT (E)
E $
Tracking our Position in Productions
S E$
E TE E T
S E $
7/30/2019 041 Bottom Up Parsing
140/140
E E + TT intT (E)
S