You are on page 1of 54

Compiler

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

int + (int) + (int)

25
int + (int) + (int)

int + ( int ) + ( int )


26
int + (int) + (int)
E + (int) + (int)

int + ( int ) + ( int )


27
int + (int) + (int)
E + (int) + (int)
E + (E) + (int)

E E

int + ( int ) + ( int )


28
int + (int) + (int)
E + (int) + (int)
E + (E) + (int) E

E + (int)
E E

int + ( int ) + ( int )

29
int + (int) + (int)
E + (int) + (int)
E + (E) + (int) E

E + (int)
E + (E) E E E

int + ( int ) + ( int )


30
A rightmost derivation in reverse E
int + (int) + (int)
E + (int) + (int)
E + (E) + (int) 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

 Initially, all input is


unexamined: ►x1 x1 . . . xn

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

You might also like