Introduction To Shift-Reduce Parsing
Introduction To Shift-Reduce Parsing
035
6 035
Introduction to Shift-Reduce Parsing
Martin Rinard
Laboratory for Computer Science
Massachusetts Institute of Technology
Orientation
• Specify Syntax Using
Context-Free Grammar Expr → Expr Op Expr
• Nonterminals Expr → (Expr)
• Terminals p → - Expr
Expr p
• Productions Expr → num
• Given a grammar, Parser Op → +
Generator produces a Op → -
parser
Op → *
• Starts with input string
• Produces parse tree
Today’s Lecture
Input String
* ( num + num )
Shift-Reduce Parser Example
p
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
Op → -
num Op → *
R UCE
REDU
* ( num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
Op → -
Expr Op → *
R UCE
REDU
num
* ( num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
Op → -
Expr Op → *
FT
SHIF
num
* ( num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
* Op → -
Expr Op → *
FT
SHIF
num
( num + num )
Shift-Reduce Parser Example
p
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
Op Op → -
Expr Op → *
R UCE
REDU
num *
( num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num *
( num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num *
num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num *
num + num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
num
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num *
+ num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
UCE
FT
SHIF
REDU
num * num
R
+ num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num * num
+ num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
+ Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num * num
num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Op Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
UCE
FT
SHIF
REDU
num * num +
R
num )
Shift-Reduce Parser Example
Expr → Expr Op Expr
Op Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num * num +
num )
Shift-Reduce Parser Example
num Expr → Expr Op Expr
Op Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
FT
SHIF
num * num +
)
Shift-Reduce Parser Example
Expr Expr → Expr Op Expr
Op Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Opp→ +
Op Op → -
Expr Op → *
UCE
FT
SHIF
REDU
)
Shift-Reduce Parser Example
p
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Expr
Opp→ +
Op Op Op → -
Expr Expr Op → *
UCE
FT
SHIF
REDU
)
Shift-Reduce Parser Example
Expr → Expr Op Expr
Expr → (Expr)
Expr → - Expr
Expr
Expr → num
( Expr
Opp→ +
Op Op Op → -
Expr Expr Op → *
FT
SHIF
• Reduce/Reduce Conflict
• Top
T off tthe
h stack t h RHS off multiple
t k may match lt i l
productions
• Which production to use in the reduction?
• Shift/Reduce Conflict
• Stack may match RHS of production
• But that may not be the right match
• May need to shift an input and later find a
different reduction
Conflicts
•Original Grammar •New Grammar
Expr → Expr Op Expr Expr → Expr Op Expr
Expr → (Expr) Expr → Expr - Expr
Expr → (Expr)
Expr → - Expr
Expr → num Expr → Expr -
O → +
Op Expr → num
Op → - Op → +
Op
p→ * Op → -
Op → *
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
Op → +
Op → -
Op → *
num - num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
Op → +
Op → -
Op → *
FT
SHIF
num - num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
Op → +
num Op → -
Op → *
FT
SHIF
- num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
Op → +
Expr Op → -
Op → *
UCE
FT
SHIF
REDU
num
R
- num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
Op → +
Expr Op → -
Op → *
FT
SHIF
num
- num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
Expr → (Expr)
Expr → Expr -
Expr
p → num
- Op → +
Expr Op → -
Op → *
FT
SHIF
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
Options: Expr → (Expr)
Reduce Expr → Expr -
Reduce Expr
p → num
- Shift Op → +
Expr Op → -
Op → *
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
- Op → +
Expr Op → -
Op → *
R UCE
REDU
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Op → +
Expr Op → -
Op → *
Expr
SHIFT
T
num -
S
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
num Op → +
Expr Op → -
Op → *
Expr
SHIFT
T
num -
S
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Expr Op → +
Expr Op → -
Op → *
Expr
R UCE
REDU
num - num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Expr Op → +
Expr Op → -
Op → *
Expr
S!
FAILS
num - num
F
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
Both of These Expr → (Expr)
Actions Work Expr → Expr -
Reduce Expr
p → num
- Shift Op → +
Expr Op → -
Op → *
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
- Op → +
Expr Op → -
Op → *
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Op Op → +
Expr Op → -
Op → *
R UCE
REDU
num -
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
num Reduce Expr
p → num
Op Op → +
Expr Op → -
Op → *
SHIFT
T
num -
S
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Expr Reduce Expr
p → num
Op Op → +
Expr Op → -
Op → *
R UCE
REDU
num - num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Expr Op → +
Expr Op Op → -
Op → *
Expr
R UCE
REDU
num - num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Reduce Expr
p → num
Expr Op → +
Expr Op Op → -
Op → *
Expr
A EPT
ACCE
num - num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Shift Expr
p → num
- Op → +
Expr Op → -
Op → *
FT
SHIF
num
num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
num Shift Expr
p → num
- Op → +
Expr Op → -
Op → *
FT
SHIF
num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Expr Shift Expr
p → num
- Op → +
Expr Op → -
Op → *
UCE
REDU
num num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Shift Expr
p → num
Expr Op → +
Expr Op → -
Op → *
UCE
Expr
REDU
num - num
Conflicts
Expr → Expr Op Expr
Expr → Expr - Expr
What Happens if Expr → (Expr)
Choose Expr → Expr -
Shift Expr
p → num
Expr Op → +
Expr Op → -
Op → *
EPT
Expr
ACCE
num - num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
This Shift/Reduce
/ Conflict Expr → Expr - Expr
Reflects Ambiguity in Expr → (Expr)
Grammar Expr → Expr -
Expr
p → num
- Op → +
Expr Op → -
Op → *
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
This Shift/Reduce
/ Conflict Expr → Expr - Expr
Reflects Ambiguity in Expr → (Expr)
Grammar Expr → Expr -
Expr
p → num
- Op → +
Expr Op → -
Op → *
Eliminate by Hacking
Grammar
num
num
Shift/Reduce/Reduce Conflict
Expr → Expr Op Expr
This Shift/Reduce
/ Expr → Expr - Expr
Conflict Can Be Expr → (Expr)
Eliminated By Expr → Expr -
Lookahead of One Expr
p → num
- Symbol Op → +
Expr Op → -
Op → *
Parser Generator Should
Handle It
num
num
Constructing a Parser
• We will construct version with no lookahead
• Key Decisions
• Shift or Reduce
• Which Production to Reduce
• Basic Idea
• Build a DFA to control shift and reduce actions
• In effect, convert grammar to pushdown
automaton
• Encode finite state control in parse table
Parser State
• Input Token Sequence ($ for end of input)
• Current State from Finite State Automaton
• Two Stacks
• State Stack (implements finite state automaton)
• Symbol Stack (terminals from input and
nonterminals from reductions)
Integrating Finite State Control
• Actions
• Push
P h Symbols
S b l and d States
St t O Onto
t Stacks
St k
• Reduce According to a Given Production
• Accept
• Selected action is a function of
• Current input ssymbol
• Current state of finite state control
• Each action specifies next state
• Implement control using parse table
Parse Tables
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
• Shift to sn
• Push input token into the symbol stack
• Push sn into state stack
• Advance to next input symbol
Parser Tables
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
• Reduce (n)
• Pop both stacks as many times as the number
off symbols
b l on the l n
th RHS off rule
• Push LHS of rule n into symbol stack
Parser Tables
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
• Accept
• Stop parsing and report success
Parse Table In Action
ACTION Goto
State ( ) $ X
s0 shift to s2 error error goto s1
s1 error error accept
s2 shift to s2 shift to s5 error goto s3
s3
3 error shift
hift tto s4
4 error
s4 reduce (2) reduce (2) reduce (2)
s5 reduce (3) reduce (3) reduce (3)
For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.