Pushdown Automata Consists of –Pushdown stack (can have terminals and nonterminals) –Finite state automaton control Can do one of three actions (based.

Post on 15-Jan-2016

221 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

Transcript

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

top related