View
6
Download
0
Category
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