Professional Documents
Culture Documents
Construction
CS 551
Rehan Ullah
Lecture 20
Bottom-up Parsing
Bottom-up parsing is more
general than top-down
parsing
Bottom-up parsers handle a
large class of grammars.
Preferred method in
practice
2
Bottom-up Parsing
Bottom-up parsing is more
general than top-down
parsing
Bottom-up parsers handle a
large class of grammars.
Preferred method in
practice
3
Bottom-up Parsing
Bottom-up parsing is more
general than top-down
parsing
Bottom-up parsers handle a
large class of grammars.
Preferred method in
practice
4
Bottom-up Parsing
Also called LR parsing
L means that tokens are
read left to right
R means that the parser
constructs a rightmost
derivation.
5
Bottom-up Parsing
Also called LR parsing
L means that tokens are
read left to right
R means that the parser
constructs a rightmost
derivation.
6
Bottom-up Parsing
Also called LR parsing
L means that tokens are
read left to right
R means that the parser
constructs a rightmost
derivation.
7
Bottom-up Parsing
LR parsers donot need
left-factored grammars
LR parsers can handle
left-recursive grammars
8
Bottom-up Parsing
LR parsers donot need
left-factored grammars
LR parsers can handle
left-recursive grammars
9
Bottom-up Parsing
LR parsing reduces a
string to the start symbol
by inverting productions.
10
Bottom-up Parsing
A derivation consists of a
series of rewrite steps
S 0 1 ... n-1
n sentence
11
Bottom-up Parsing
S 0 ... n sentence
Each i is a sentential form
if contains only terminals,
is a sentence in L(G)
If contains 1 nonterminals,
is a sentential form
12
Bottom-up Parsing
S 0 ... n sentence
Each i is a sentential form
if contains only terminals,
is a sentence in L(G)
If contains 1 nonterminals,
is a sentential form
13
Bottom-up Parsing
S 0 ... n sentence
Each i is a sentential form
if contains only terminals,
is a sentence in L(G)
If contains 1 nonterminals,
is a sentential form
14
Bottom-up Parsing
A bottom-up parser builds a
derivation by working from
input sentence back towards
the start symbol S
S 0 ... n sentence
15
Bottom-up Parsing
Consider the grammar
S → aABe
A → Abc | b
B →d
16
Bottom-up Parsing
The sentence abbcde can be
reduced to S:
abbcde
aAbcde
aAde
aABe
S
17
Bottom-up Parsing
The sentence abbcde can be
reduced to S:
abbcde
aAbcde
aAde
aABe
S
18
Bottom-up Parsing
The sentence abbcde can be
reduced to S:
abbcde
aAbcde
aAde
aABe
S
19
Bottom-up Parsing
The sentence abbcde can be
reduced to S:
abbcde
aAbcde
aAde
aABe
S
20
Bottom-up Parsing
The sentence abbcde can be
reduced to S:
abbcde
aAbcde
aAde
aABe
S
21
Bottom-up Parsing
These reductions, in fact,
trace out the following right-
most derivation in reverse:
S aABe
aAde
aAbcde
abbcde
22
S By y xy
rm rm rm
S
rule: B →
B
x y
Terminals only
23
Bottom-up Parsing
Consider the grammar
1. E → E + (E)
2. | int
24
Bottom-up Parsing
Consider bottom-up parse of
the string
25
int + (int) + (int)
E E
E + (int)
E E
29
int + (int) + (int)
E + (int) + (int)
E + (E) + (int) E
E + (int)
E + (E) E E E
E + (int)
E + (E) E E E
E
int + ( int ) + ( int )
31
Bottom-up Parsing
An LR parser traces a
rightmost derivation in
reverse
32
Consequence
Let be a step of a
bottom-up parse
Assume that next reduction
is A →
Then is a string of
terminals!
33
Consequence
Let be a step of a
bottom-up parse
Assume that next reduction
is A →
Then is a string of
terminals!
34
Consequence
Let be a step of a
bottom-up parse
Assume that next reduction
is A →
Then is a string of
terminals!
35
Consequence
Why?
Because A → is a
step in a rightmost
derivation
36
Notation
Idea:
Split the string into two
substrings
37
Notation
Right substring (a string of
terminals) is as yet
unexamined by parser
Left substring has
terminals and non-
terminals
38
Notation
Right substring (a string of
terminals) is as yet
unexamined by parser
Left substring has
terminals and non-
terminals
39
Notation
The dividing point is marked
by a ►
• The ► is not part of the string
40
Shift-Reduce Parsing
Bottom-up parsing uses only
two kinds of actions:
1. Shift
2. Reduce
41
Shift
Move ► one place to the right
shifts a terminal to the left
string
E + (► int) E + (int ►)
42
Reduce
Apply an inverse production
at the right end of the left
string. If E → E + (E) is a
production, then
E + ( E+(E)►) E + ( E ►)
43
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
44
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
45
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
46
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
47
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
48
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
49
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
50
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
51
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
52
Shift-Reduce Example
►int + (int) + (int) $ shift
int ► + (int) + (int) $ reduce E → int
E ► + (int) + (int) $ shift 3 times
E + (int ►) + (int) $ reduce E → int
E + (E ►) + (int) $ shift
E + (E) ► + (int) $ reduce E → E+(E)
53
Shift-Reduce Example
E ► + (int) $ shift 3 times
E + (int ►) $ reduce E → int
E + (E ►) $ shift
E + (E) ► $ red E → E+(E)
E►$ accept
54