Syntactic Analysis - Information Sciences Institutepedro/Teaching/CSCI565-Spring16/Lectures/... ·...

Preview:

Citation preview

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu

Syntactic Analysis

Implementing a ParserLR parsing tables

Copyright 2016, Pedro C. Diniz, all rights reserved.Students enrolled in Compilers class at University of Southern California (USC)have explicit permission to make copies of these materials for their personal use.

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 2

Outline

• Implementing a Parser • Shift-Reduce Parser Example• Why is it hard to build a Parser Engine?• LR(k) Parser Tables

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 3

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 4

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

( )

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 5

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

– L - parse from left to right– R - parse from right to left

( )

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 6

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

– L - leftmost derivation– R - rightmost derivation

( )

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 7

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

– Number of lookahead characters

( )

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 8

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

– Examples: LL(0), LR(1)

( )

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 9

• Different Parsing Techniques– Each can handle some set of CFGs– Categorization of techniques

– Examples: LL(0), LR(1)

• We will be studying LR(k) parsers

( )L R k

Implementing a Parser

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 10

• Implementing a Parser• Shift-Reduce Parser Example• Why is it hard to build a parser engine?• LR(k) parser tables• Constructing a LR(0) Parser Engine

Outline

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 11

Why use a LR(k) parser• Can be construct to recognize a large class of CFGs

– virtually all programming language constructs

• Most general non-backtracking parsing method

• Can build a very efficient very parser engine

• Can detect a syntactic error as soon as it is possible to do so

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 12

Let’s look at a Parser Implementation

• Workings of a LR(k) Parser• Parse from Left to Right • Rightmost Derivation

– Starts with the entire String– Ends with the Start Symbol

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 13

Actions of a Shift-Reduce Parser

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 14

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 15

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 16

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 17

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 18

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 19

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 20

Actions of a Shift-Reduce Parser

ParseTreeParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 21

Actions of a Shift-Reduce Parser

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 22

Actions of a Shift-Reduce Parser

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 23

Actions of a Shift-Reduce Parser

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 24

Actions of a Shift-Reduce Parser

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 25

Actions of a Shift-Reduce Parser

• Cannot create a full sub parse tree • Need the look ahead information• Thus, keep some state

ParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 26

Actions of a Shift-Reduce Parser

Cur

rent

Sta

teParseTree

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 27

Actions of a Shift-Reduce Parser

Stac

k

Current Symbol

StackParser A

ction

ParserEngine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 28

Actions of a Shift-Reduce Parser

• Shift– Shift the current element on top of the stack– Move the current input pointer

• Reduce– Apply a production– Top of the stack should match the RHS of a production– Remove those symbols from the stack– Add the LHS non-terminal to the stack

• Accept– End of stream reached &– Stack only has the start symbol

• Reject– End of stream reached but – stack has more than the start symbol

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 29

Shift-Reduce Parser Example

* ( + num )numnum

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 30

Shift-Reduce Parser Example

* ( + num )numnum

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 31

Shift-Reduce Parser Example

* ( + num )numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 32

Shift-Reduce Parser Example

* ( + num )numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 33

Shift-Reduce Parser Example

* ( + num )num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

num

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 34

Shift-Reduce Parser Example

* ( + num )numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

num

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 35

Shift-Reduce Parser Example

* ( + num )numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

num

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 36

Shift-Reduce Parser Example

* ( + num )numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

num

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 37

Shift-Reduce Parser Example

* ( + num )num

<expr><expr> <expr><op> <op>

<expr>

<expr>

<expr>

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 38

Shift-Reduce Parser Example

* ( + num )num

<expr><expr> <expr><op> <op>

<expr>

<expr>

<expr>

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 39

Shift-Reduce Parser Example

( + num )num

<expr><expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

*<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 40

Shift-Reduce Parser Example

( + num )num

<expr><expr> <expr>

<op><op>

<expr>

<expr>

<expr>

num *

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

*<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 41

Shift-Reduce Parser Example

( + num )num

<expr><expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

*<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 42

Shift-Reduce Parser Example

( + num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op><expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 43

(

Shift-Reduce Parser Example

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num *

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op><expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 44

Shift-Reduce Parser Example

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num * (

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 45

Shift-Reduce Parser Example

+ num )num

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num * (

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 46

Shift-Reduce Parser Example

* + num )

<expr><expr> <expr>

<op><op>

<expr>

<expr>

<expr>

num ( num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

num

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 47

Shift-Reduce Parser Example

* + num )

<expr><expr> <expr>

<op><op>

<expr>

<expr>

<expr>

num ( num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

num

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 48

Shift-Reduce Parser Example

* + num )

<expr><expr>

<op>

<expr>

<expr>

<expr>

num ( num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

num

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 49

Shift-Reduce Parser Example

* + num )

<expr> <expr><expr>

<op><op>

<expr>

<expr><expr>

num ( num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 50

+

Shift-Reduce Parser Example

* num )

<expr> <expr><expr>

<op><op>

<expr>

<expr>

<expr>

num ( num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 51

Shift-Reduce Parser Example

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>+

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 52

Shift-Reduce Parser Example

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>+

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 53

Shift-Reduce Parser Example

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>+

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 54

Shift-Reduce Parser Example

* num )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 55

num

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num +

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 56

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>num

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 57

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>num

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 58

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>num

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 59

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 60

Shift-Reduce Parser Example

* )

<expr> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>

<expr>

<expr>

<op><expr> <expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 61

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr><op>

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 62

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 63

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 64

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>)

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 65

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op>(

<expr>)

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 66

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )

<expr> → - <expr><expr> → num

<op> → +<op> → -<op> → *

<op>(

<expr>)

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 67

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )

<expr> → - <expr><expr> → num

<op> → +<op> → -<op> → *

<op><expr>

<expr>

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 68

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op><expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 69

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *

<op><expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 70

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 71

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 72

Shift-Reduce Parser Example

* )

<expr> <expr> <expr><op> <op>

<expr>

<expr>

num ( num + num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → - <expr>

<expr> → num<op> → +<op> → -<op> → *<expr>

<expr>

AC

CEP

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 73

What does the Parser Engine do?• If the top symbols of the stack match an RHS

of a production do the reduction – Pop the RHS from the top of the stack– Push the LHS symbol onto the stack

• If no production is found do the shift– Push the current input into the stack

• If the input is empty– Accept if only the start symbol is on the stack– Reject otherwise Parser

Engine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 74

Outline• Implementing a Parser • Shift-Reduce Parser Example• Why is it Hard to build a Parser Engine?• LR(k) parser tables• Constructing a LR(0) Parser Engine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 75

What does the Parser Engine do?• If the Top Symbols of the Stack Match an RHS

of a Production do the Reduction – Pop the RHS from the top of the stack– Push the LHS symbol onto the stack

• If No Production is Found do the Shift– Push the current input into the stack

• If the Input is Empty– Accept if only the start symbol is on the stack– Reject otherwise Parser

Engine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 76

This is not that Simple!

• Many Choices of Reductions– Matches multiple RHS

• Choice between Shift and Reduce– Stack matches a RHS– But that may not be the right match– May need to shift and later find a different reduction

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 77

Shift-Reduce Parser Example

<expr> → <expr> <op> <expr><expr> → ( <expr> )

<expr> → - <expr><expr> → num<op> → +<op> → -<op> → *

• Change in the Grammar

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 78

Shift-Reduce Parser Example

<expr> → <expr> <op> <expr><expr> → ( <expr> )

<expr> → - <expr><expr> → num<op> → +<op> → -<op> → *

• Change in the Grammar

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 79

Shift-Reduce Parser Example

<expr> → <expr> <op> <expr><expr> → ( <expr> )

<expr> → <expr> -<expr> → num<op> → +<op> → -<op> → *

• Change in the Grammar

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 80

Shift-Reduce Parser Example

- numnum

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 81

Shift-Reduce Parser Example

- num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

num

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 82

num

Shift-Reduce Parser Example

- numnumnum

SHIF

T

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 83

num

Shift-Reduce Parser Example

- num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 84

num

Shift-Reduce Parser Example

- num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 85

<expr>

Shift-Reduce Parser Example

- num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum

RED

UC

E

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 86

<expr>

Shift-Reduce Parser Example

- num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 87

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<op><expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 88

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<op><expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 89

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

We have a choice!!!<op><expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 90

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<op><expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 91

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 92

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 93

num<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 94

num<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 95

num<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 96

<expr><expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

<expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 97

<expr><expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!<expr>

<expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 98

<expr><expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

But not the right thing to do!!No more actions!!!

<expr>

<expr>

<expr>

ERR

OR

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 99

Shift-Reduce Parser Example

numnumnum -

• But this is perfectly valid input for the grammar• We chose a wrong production • Lets see what is the right production

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 100

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

We have a choice<op><expr>

RED

UC

E

The step before we went wrong

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 101

-<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

Use the other production

<op><expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 102

<op><expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr>

RED

UC

E

<op> Use the other production

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 103

<op><expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 104

num<op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op>

SHIF

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 105

num<op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 106

num<op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 107

<expr><op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op>

RED

UC

E

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 108

<expr><op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op> <expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 109

<expr><op>

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op> <expr>

RED

UC

E

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 110

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op> <expr>

RED

UC

E<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 111

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op> <expr>

<expr>

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 112

<expr>

Shift-Reduce Parser Example

num

<expr> → <expr> <op> <expr><expr> → ( <expr> )<expr> → <expr> -

<expr> → num<op> → +<op> → -<op> → *

numnum -

<expr> <op> <expr>

<expr>

AC

CEP

T

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 113

This is not that Simple!

• Many Choices of Reductions– Matches Multiple RHS

• Choice between Shift and Reduce– Stack Matches a RHS– But that may not be the ‘right’ match– May need to Shift and later find a different Reduction

• Keep additional information

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 114

Outline

• Implementing a Parser • Shift-Reduce Parser Example• Why is it hard to build a Parser Engine?• LR(k) parser tables• Constructing a LR(0) Parser Engine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 115

Constructing a LR(k) Parser

• We will construct few LR(k) parsers– LR(0), – SLR (or simple LR)– LR(1)

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 116

Constructing a LR(k) Parser

• We will construct few LR(k) parsers– LR(0), – SLR (or simple LR)– LR(1)

• We followed the Parsing Actions• What is in the Parse Engine?

– Decision between shift and reduce– Decide on the “right” reduction

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 117

Actions of a Shift-Reduce Parser

Stac

k

Current Symbol

StackParser A

ction

ParserEngine

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 118

Constructing a LR(k) Parser• Create a DFA

– Encodes all the possible states that the parser can be in– DFA state transition occurs on terminals and non-terminals

• Create an Parser table – Stores what action should be taken for the current

state and current input character

• Maintain a Stack of States – in parallel with the stack of symbols

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 119

LR(k) Parser Engine

Current Symbol

Parser Action

LR(k)ParserEngine

Sym

bol S

tack

Stat

e St

ack

ACTION GotoState ( ) $ X

s0 shift to s2 error error goto s1s1 error error accept s2 shift to s2 shift to s5 error goto s3s3 error shift to s4 error s4 reduce (2) reduce (2) reduce (2) s5 reduce (3) reduce (3) reduce (3)

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 120

Parser Tables

• Look-up [top of state stack] [ input symbol] in the Parser Table

• Carry-out the Corresponding Action

ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accepts2 shift to s2 shift to s5 error goto s3s3 error shift to s4 errors4 reduce (2) reduce (2) reduce (2)s5 reduce (3) reduce (3) reduce (3)

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 121

• Shift to sn– Push input token into the symbol stack– Push sn into state stack and move to state sn– Advance to next input symbol

ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accepts2 shift to s2 shift to s5 error goto s3s3 error shift to s4 errors4 reduce (2) reduce (2) reduce (2)s5 reduce (3) reduce (3) reduce (3)

Parser Tables

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 122

• Reduce (n)– Pop both stacks as many times as the number of symbols on the RHS of rule n– Push LHS of production onto the symbol stack – Let t be top of state stack

– Lookup [top of the state stack t][top of symbol stack] in Goto section of table– Push that state (in Goto k) into state stack and move to that state

ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accepts2 shift to s2 shift to s5 error goto s3s3 error shift to s4 errors4 reduce (2) reduce (2) reduce (2)s5 reduce (3) reduce (3) reduce (3)

Parser Tables

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 123

• Accept– Stop parsing and report success

ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accepts2 shift to s2 shift to s5 error goto s3s3 error shift to s4 errors4 reduce (2) reduce (2) reduce (2)s5 reduce (3) reduce (3) reduce (3)

Parser Tables

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 124

• Error– Stop parsing and report failure

ACTION GotoState ( ) $ Xs0 shift to s2 error error goto s1s1 error error accepts2 shift to s2 shift to s5 error goto s3s3 error shift to s4 errors4 reduce (2) reduce (2) reduce (2)s5 reduce (3) reduce (3) reduce (3)

Parser Tables

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 125

LR Example

• The grammar<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 126

Question

• The grammar<S> → <X>$ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

• What is the language accepted by this CFG?

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 127

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 128

Parser Table in ActionAction Table

• The grammar<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 129

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 130

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 131

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 132

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 133

(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 134

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 135

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 136

(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 137

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 138

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

s5 )(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 139

s5 )(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 140

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

s5 )(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 141

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

s5 )(s2(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 142

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

s5 )(s2

(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 143

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 144

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 145

s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 146

s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 147

s4 )s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 148

s4 )s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 149

s4 )s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 150

s4 )s3

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X(s2

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 151

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 152

s1

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 153

s1

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 154

s1

Action GotoState ( ) $

s0 goto s1

s1s2s3s4s5

goto s3

errorerrorerror

accept

error

errorerror

error

shift to s2

shift to s2

reduce (2)reduce (3)

reduce (2)reduce (3)

reduce (2)reduce (3)

shift to s5shift to s4

X

X

Parser Table in Action• The grammar

<S> → <X> $ (1)<X> → ( <X> ) (2)<X> → ( ) (3)

s0 $)( ( ) $ Accept

Action Table

Spring 2016CSCI 565 - Compiler Design

Pedro Dinizpedro@isi.edu 155

Summary

• Parser Implementation• Shift-Reduce Parsing• Examples

Recommended