Pushdown Automata• Consists of
– Pushdown stack (can have terminals and nonterminals)
– Finite state automaton control
• Can do one of three actions (based on state and input):– Shift: Move current input from input onto stack
– Reduce:• If symbols on top of stack match right hand side of some grammar production NT
• Pop symbols () off of the stack• Push left hand side nonterminal (NT) onto stack
– Accept the input string
Shift-Reduce Parser Example
* ( + num )numnum
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Stack
Tokenized Input String 5*(2+3)
Shift-Reduce Parser Example
* ( + num )numnum
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Grammar Rules
SHIFT
Shift-Reduce Parser Example
* ( + num )numnum
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
SHIFT
Shift-Reduce Parser Example
* ( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Shift-Reduce Parser Example
* ( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
REDUCE
Shift-Reduce Parser Example
* ( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
REDUCE
Expr
Shift-Reduce Parser Example
* ( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
SHIFT
Shift-Reduce Parser Example
( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
SHIFT
*
Shift-Reduce Parser Example
( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
REDUCE
*
Shift-Reduce Parser Example
( + num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
Shift-Reduce Parser Example
+ num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
Shift-Reduce Parser Example
+ num )num
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
Shift-Reduce Parser Example
+ num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Shift-Reduce Parser Example
+ num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
REDUCE
Expr
Shift-Reduce Parser Example
+ num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Shift-Reduce Parser Example
num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
+
Shift-Reduce Parser Example
num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Op
REDUCE
+
Shift-Reduce Parser Example
num )
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Op
+
Shift-Reduce Parser Example
)
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
num
Op
+
Shift-Reduce Parser Example
)
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Op
+
Expr
REDUCE
num
Shift-Reduce Parser Example
)
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num +
REDUCE
num
Expr
Expr
Op
ExprExpr
Shift-Reduce Parser Example
)
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Op
+
Expr
num
Expr
Shift-Reduce Parser Example
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*SHIFT
(
num
Expr
Op
+
Expr
num
Expr
)
REDUCE
Shift-Reduce Parser Example
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *
Expr
Op
*
(
num
Expr
Op
+
Expr
num
Expr
)Expr
REDUCE
Shift-Reduce Parser Example
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *Expr
Op
*
(
num
Expr
Op
+
Expr
num
Expr
)Expr
Expr
ACCEPT!
Shift-Reduce Parser Example
num
Expr Expr Op Expr Expr (Expr)Expr - Expr
Expr numOp +Op -Op *Expr
Op
*
(
num
Expr
Op
+
Expr
num
Expr
)Expr
Expr
*
num:5
num:2
+
num:3
Input String
5 * (2 + 3)
Basic Idea
• Goal: reconstruct parse tree for input string
• Read input from left to right• Build tree in a bottom-up fashion
• Use stack to hold pending sequences of terminals and nonterminals
Potential Conflicts
• Reduce/Reduce Conflict– Top of the stack may match RHS of multiple 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
Expr Expr Op ExprExpr (Expr)
Expr - ExprExpr numOp +Op - Op *
•Original GrammarExpr Expr Op ExprExpr Expr - ExprExpr (Expr)
Expr Expr - Expr numOp +Op - Op *
•New Grammar
Conflicts
- numnum
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Conflicts
- numnum
SHIFT
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Conflicts
- num
SHIFT
num
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Conflicts
- num
SHIFT
Expr
REDUCE
num
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Conflicts
- num
SHIFT
Expr
num
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Conflicts
num
SHIFT
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Options:ShiftReduceReduce
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
REDUCE
Shift/Reduce/Reduce Conflict
num
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
SHIFT
Expr
Shift/Reduce/Reduce Conflict
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
SHIFT
Expr
num
Shift/Reduce/Reduce Conflict
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
REDUCE
Expr
Expr
num
Shift/Reduce/Reduce Conflict
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
FAILS!
Expr
Expr
num
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
Both of These Actions Work
ReduceShift
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
Shift/Reduce/Reduce Conflict
num
Expr
num
Op
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
-
REDUCE
Shift/Reduce/Reduce Conflict
Expr
num
Op
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
-
SHIFT
num
Shift/Reduce/Reduce Conflict
Expr
num
Op
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
-
REDUCE
Expr
num
Shift/Reduce/Reduce Conflict
Expr
num
Op
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
-
REDUCE
Expr
num
Expr
Shift/Reduce/Reduce Conflict
Expr
num
Op
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
What Happens if Choose
Reduce
-
ACCEPT
Expr
num
Expr
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
SHIFT
Conflicts
What Happens if Choose
Shift
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
SHIFT
num
Conflicts
What Happens if Choose
Shift
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
REDUCE
Expr
Conflicts
num
What Happens if Choose
Shift
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
REDUCE
Expr
Conflicts
num
Expr
What Happens if Choose
Shift
Expr
num -
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
ACCEPT
Expr
Conflicts
num
Expr
What Happens if Choose
Shift
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
This Shift/Reduce Conflict Reflects Ambiguity in Grammar
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
This Shift/Reduce Conflict Reflects Ambiguity in Grammar
Eliminate by HackingGrammar
Shift/Reduce/Reduce Conflict
num
Expr
num
-
Expr Expr Op ExprExpr Expr - Expr
Expr (Expr)Expr Expr -
Expr numOp +Op -Op *
This Shift/Reduce Conflict Can Be Eliminated By Lookahead of One Symbol
Parser Generator Should Handle It