LR(1) Parsers Part III Last Parsing Lecture. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

Similar documents
LR(1) Parsers Part II. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

LR(1) Parsers Part II. Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

Syntax Analysis, VII The Canonical LR(1) Table Construction. Comp 412 COMP 412 FALL Chapter 3 in EaC2e. source code. IR IR target.

Syntax Analysis, VII The Canonical LR(1) Table Construction. Comp 412

Parsing VI LR(1) Parsers

Syntax Analysis, VI Examples from LR Parsing. Comp 412

CS415 Compilers Syntax Analysis Bottom-up Parsing

Computer Science 160 Translation of Programming Languages

Administrivia. Test I during class on 10 March. Bottom-Up Parsing. Lecture An Introductory Example

Lecture 11 Sections 4.5, 4.7. Wed, Feb 18, 2009

Bottom-Up Parsing. Ÿ rm E + F *idÿ rm E +id*idÿ rm T +id*id. Ÿ rm F +id*id Ÿ rm id + id * id

CS 314 Principles of Programming Languages

Lecture VII Part 2: Syntactic Analysis Bottom-up Parsing: LR Parsing. Prof. Bodik CS Berkley University 1

Shift-Reduce parser E + (E + (E) E [a-z] In each stage, we shift a symbol from the input to the stack, or reduce according to one of the rules.

Compiler Design Spring 2017

Compiler Design 1. LR Parsing. Goutam Biswas. Lect 7

LR2: LR(0) Parsing. LR Parsing. CMPT 379: Compilers Instructor: Anoop Sarkar. anoopsarkar.github.io/compilers-class

Parsing -3. A View During TD Parsing

CS 406: Bottom-Up Parsing

1. For the following sub-problems, consider the following context-free grammar: S AA$ (1) A xa (2) A B (3) B yb (4)

Syntax Analysis (Part 2)

CS415 Compilers Syntax Analysis Top-down Parsing

Syntactic Analysis. Top-Down Parsing

EXAM. CS331 Compiler Design Spring Please read all instructions, including these, carefully

Syntax Analysis Part I

Bottom up parsing. General idea LR(0) SLR LR(1) LALR To best exploit JavaCUP, should understand the theoretical basis (LR parsing);

1. For the following sub-problems, consider the following context-free grammar: S AB$ (1) A xax (2) A B (3) B yby (5) B A (6)

THEORY OF COMPILATION

EXAM. CS331 Compiler Design Spring Please read all instructions, including these, carefully

Lexical Analysis Part II: Constructing a Scanner from Regular Expressions

CA Compiler Construction

Introduction to Bottom-Up Parsing

Introduction to Bottom-Up Parsing

Compiler Construction Lent Term 2015 Lectures (of 16)

Compiler Construction Lent Term 2015 Lectures (of 16)

Introduction to Bottom-Up Parsing

Announcements. H6 posted 2 days ago (due on Tue) Midterm went well: Very nice curve. Average 65% High score 74/75

Compiler Construction Lectures 13 16

n Top-down parsing vs. bottom-up parsing n Top-down parsing n Introduction n A top-down depth-first parser (with backtracking)

Introduction to Bottom-Up Parsing

1. For the following sub-problems, consider the following context-free grammar: S A$ (1) A xbc (2) A CB (3) B yb (4) C x (6)

Syntax Analysis Part I

Top-Down Parsing and Intro to Bottom-Up Parsing

I 1 : {S S } I 2 : {S X ay, Y X } I 3 : {S Y } I 4 : {X b Y, Y X, X by, X c} I 5 : {X c } I 6 : {S Xa Y, Y X, X by, X c} I 7 : {X by } I 8 : {Y X }

Talen en Compilers. Johan Jeuring , period 2. October 29, Department of Information and Computing Sciences Utrecht University

Syntax Analysis Part I. Position of a Parser in the Compiler Model. The Parser. Chapter 4

EXAM. Please read all instructions, including these, carefully NAME : Problem Max points Points 1 10 TOTAL 100

CMSC 330: Organization of Programming Languages. Pushdown Automata Parsing

CPS 220 Theory of Computation

CS20a: summary (Oct 24, 2002)

Parsing Algorithms. CS 4447/CS Stephen Watt University of Western Ontario

Harvard CS 121 and CSCI E-207 Lecture 10: CFLs: PDAs, Closure Properties, and Non-CFLs

Everything You Always Wanted to Know About Parsing

Chapter 4: Bottom-up Analysis 106 / 338

Why augment the grammar?

Computer Science 160 Translation of Programming Languages

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Context free languages

CS Pushdown Automata

Compiling Techniques

Lexical Analysis: DFA Minimization & Wrap Up

Syntactical analysis. Syntactical analysis. Syntactical analysis. Syntactical analysis

CS5371 Theory of Computation. Lecture 7: Automata Theory V (CFG, CFL, CNF)

Compiling Techniques

Predictive parsing as a specific subclass of recursive descent parsing complexity comparisons with general parsing

CISC4090: Theory of Computation

CSE 105 THEORY OF COMPUTATION

ΕΠΛ323 - Θεωρία και Πρακτική Μεταγλωττιστών. Lecture 7a Syntax Analysis Elias Athanasopoulos

Compilers. Lexical analysis. Yannis Smaragdakis, U. Athens (original slides by Sam

Conflict Removal. Less Than, Equals ( <= ) Conflict

Syntax Analysis: Context-free Grammars, Pushdown Automata and Parsing Part - 3. Y.N. Srikant

Theory of Computation

Compiler Principles, PS4

Syntax Analysis Part III

CS153: Compilers Lecture 5: LL Parsing

Compiling Techniques

Pushdown Automata (Pre Lecture)

Translator Design Lecture 16 Constructing SLR Parsing Tables

Context Free Grammars

Compiler Design. Spring Syntactic Analysis. Sample Exercises and Solutions. Prof. Pedro C. Diniz

Computing if a token can follow

Bottom-Up Syntax Analysis

Pushdown Automata (2015/11/23)

Introduction to Theory of Computing

Computational Models - Lecture 4

Bottom-Up Syntax Analysis

Follow sets. LL(1) Parsing Table

CS 301. Lecture 18 Decidable languages. Stephen Checkoway. April 2, 2018

Material Covered on the Final

CMPT-825 Natural Language Processing. Why are parsing algorithms important?

INF5110 Compiler Construction

Syntax Analysis - Part 1. Syntax Analysis

CSE302: Compiler Design

Ambiguity, Precedence, Associativity & Top-Down Parsing. Lecture 9-10

FORMAL LANGUAGES, AUTOMATA AND COMPUTABILITY

Compiling Techniques

Lecture 11 Context-Free Languages

Handout 8: Computation & Hierarchical parsing II. Compute initial state set S 0 Compute initial state set S 0

Parsing with CFGs L445 / L545 / B659. Dept. of Linguistics, Indiana University Spring Parsing with CFGs. Direction of processing

Parsing with CFGs. Direction of processing. Top-down. Bottom-up. Left-corner parsing. Chart parsing CYK. Earley 1 / 46.

Transcription:

LR(1) Parsers Part III Last Parsing Lecture Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.

LR(1) Parsers A table-driven LR(1) parser looks like source code Scanner Table-driven Parser IR grammar Parser Generator ACTION & GOTO Tables Tables can be built by hand However, this is a perfect task to automate

Bottom-up Parser A simple shift-reduce parser: push INVALID token next_token( ) repeat until (top of stack = Goal and token = EOF) if the top of the stack is a handle A b then // reduce b to A pop b symbols off the stack push A onto the stack else if (token ¹ EOF) then // shift push token token next_token( ) else // need to shift, but out of input report an error

LR(1) Parsers (parse tables) To make a parser for L(G), need a set of tables The grammar 1 Goal SheepNoise 2 SheepNoise SheepNoise baa 3 baa The tables ACTION Table State EOF baa 0 shift 2 1 accept shift 3 2 reduce 3 reduce 3 3 reduce 2 reduce 2 GOTO Table State SheepNoise 0 1 1 0 2 0 3 0

LR(1) Parsers (parse tables) To make a parser for L(G), need a set of tables The grammar 1 Goal SheepNoise 2 SheepNoise SheepNoise baa 3 baa The tables ACTION Table State EOF baa 0 shift 2 1 accept shift 3 2 reduce 3 reduce 3 3 reduce 2 reduce 2 GOTO Table State SheepNoise 0 1 1 0 2 0 3 0 Correspond to state

LR(1) Parsers (parse tables) To make a parser for L(G), need a set of tables The grammar 1 Goal SheepNoise 2 SheepNoise SheepNoise baa 3 baa The tables ACTION Table State EOF baa 0 shift 2 1 accept shift 3 2 reduce 3 reduce 3 3 reduce 2 reduce 2 State GOTO Table SheepNoise 0 1 1 0 2 0 3 0 Correspond to production rule

Building LR(1) Tables : ACTION and GOTO How do we build the parse tables for an LR(1) grammar? Use grammar to build model of Control DFA ACTION table Provides actions to perform GOTO table Tells us state to goto next If table construction succeeds, the grammar is LR(1)

Building LR(1) Tables: The Big Picture Model the state of the parser with LR(1) items Use two functions: goto(s, X) closure(s) Build up states and transition functions of the DFA

Parenthesis Grammar

LR(1) Parsers The Control DFA for the Parentheses Language Pair ) List S 0 S 1 ( ( S 4 S 5 S 8 Pair ( ( Pair S 3 S 6 S 9 S 11 ) Pair S 2 ) ) S 7 S 10 Control DFA for the Parentheses Language Transitions on terminals represent shift actions Transitions on nonterminals represent reduce actions [ACTION] [GOTO] The table construction derives this DFA from the grammar

LR(1) Items LR(1) items represent set of valid states An LR(1) item is a pair [P, d], where P is a production A b with a at some position in the rhs d is a lookahead string (word or EOF) The ( placeholder ) in item indicates TOS position

LR(1) Items [A bg,a] means that input seen so far is consistent with use of A bg immediately after the symbol on TOS possibility [A b g,a] means that input seen so far is consistent with use of A bg at this point in the parse, and that the parser has already recognized b (that is, b is on TOS) partially complete [A bg,a] means that parser has seen bg, and that a lookahead symbol of a is consistent with reducing to A. complete

LR(1) Items Production A b, b = B 1 B 2 B 3 and lookahead a, gives rise to 4 items [A B 1 B 2 B 3,a] [A B 1 B 2 B 3,a] [A B 1 B 2 B 3,a] [A B 1 B 2 B 3,a] The set of LR(1) items for a grammar is finite

Lookahead symbols? Helps to choose the correct reduction { [A b,a],[b g d,b] } lookahead of a Þ reduce to A; lookahead in FIRST(d) Þ shift

LR(1) Table Construction : Overview Build Canonical Collection (CC) of sets of LR(1) Items, I Step 1: Start with initial state, s 0 [S S,EOF], along with any equivalent items Derive equivalent items as closure( s 0 ) Grammar has an unique goal symbol 14

LR(1) Table Construction : Overview Step 2: For each s k, and each symbol X, compute goto(s k,x) If the set is not already in CC, add it Record all the transitions created by goto( ) This eventually reaches a fixed point 15

LR(1) Table Construction : Overview Step 3: Fill in the table from the collection of sets of LR(1) items The states of canonical collection are precisely the states of the Control DFA The construction traces the DFA s transitions 16

Computing Closures Closure(s) adds all the items implied by the items already in state s s [A b C d,a] Closure([A b C d,a]) adds [C t,x] where C is on the lhs and each x Î FIRST(da) Since bc d is valid, any way to derive bc d is valid

Closure algorithm Closure( s ) while ( s is still changing ) " items [A b C d,a] Î s " productions C t Î P " x Î FIRST(da) // d might be e if [C t,x] Ï s then s s È { [C t,x] } Classic fixed-point method Halts because s Ì ITEMS Closure fills out a state

Closure algorithm Closure( s ) while ( s is still changing ) " items [A b C d,a] Î s " productions C t Î P " x Î FIRST(da) // d might be e if [C t,x] Ï s then s s È { [C t,x] } Classic fixed-point method Halts because s Ì ITEMS Closure fills out a state

Closure algorithm Closure( s ) while ( s is still changing ) " items [A b C d,a] Î s " productions C t Î P " x Î FIRST(da) // d might be e if [C t,x] Ï s then s s È { [C t,x] } Classic fixed-point method Halts because s Ì ITEMS Closure fills out a state

Closure algorithm Closure( s ) while ( s is still changing ) " items [A b C d,a] Î s " productions C t Î P " x Î FIRST(da) // d might be e if [C t,x] Ï s then s s È { [C t,x] } Classic fixed-point method Halts because s Ì ITEMS Closure fills out a state

Closure algorithm Closure( s ) while ( s is still changing ) " items [A b C d,a] Î s " productions C t Î P " x Î FIRST(da) // d might be e if [C t,x] Ï s then s s È { [C t,x] } Classic fixed-point method Halts because s Ì ITEMS Closure fills out a state

Example From SheepNoise Initial step builds the item [Goal SheepNoise,EOF] and takes its closure( ) Closure( [Goal SheepNoise,EOF] ) 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa

Example From SheepNoise Initial step builds the item [Goal SheepNoise,EOF] and takes its closure( ) Closure( [Goal SheepNoise,EOF] ) 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa # Item Derived from 1 [Goal SheepNoise,EOF] Original item 2 [SheepNoise SheepNoise baa, EOF] 1, da is EOF 3 [SheepNoise baa, EOF] 1, da is EOF 4 [SheepNoise SheepNoise baa, baa] 2, da is baa baa 5 [SheepNoise baa, baa] 2, da is baa baa So, S 0 is { [Goal SheepNoise,EOF], [SheepNoise SheepNoise baa,eof], [SheepNoise baa,eof], [SheepNoise SheepNoise baa,baa], [SheepNoise baa,baa] }

Computing Gotos Goto(s,x) computes state parser would reach if it recognized x while in state s Goto( { [A b X d,a] }, X ) Produces [A bx d,a] Creates new LR(1) item & uses closure() to fill out the state

Goto Algorithm Goto( s, X ) new Ø " items [A b X d,a] Î s new new È {[A bx d,a]} return closure(new) Not a fixed-point method! Uses closure( ) Goto() moves us forward

Example from SheepNoise S 0 is { [Goal SheepNoise,EOF], [SheepNoise SheepNoise baa,eof], [SheepNoise baa,eof], [SheepNoise SheepNoise baa,baa], [SheepNoise baa,baa] } Goto( S 0, baa ) 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa

Example from SheepNoise S 0 is { [Goal SheepNoise,EOF], [SheepNoise SheepNoise baa,eof], [SheepNoise baa,eof], [SheepNoise SheepNoise baa,baa], [SheepNoise baa,baa] } Goto( S 0, baa ) Loop produces 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa Item Source [SheepNoise baa, EOF] Item 3 in s 0 [SheepNoise baa, baa] Item 5 in s 0 Closure adds nothing since is at end of rhs in each item In the construction, this produces s 2 { [SheepNoise baa, {EOF,baa}] } New, but obvious, notation for two distinct items [SheepNoise baa, EOF] & [SheepNoise baa, baa]

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x Add initial state; fill out state with closure

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x Fixed-point computation Loop adds to S

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x Iterate through all items in state and all symbols

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x Call goto function to get transition from s j to new state t

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x Add t to CC and add transition in DFA

Canonical Collection Algorithm s 0 closure ( [S S,EOF] ) S { s 0 } k 1 while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) if t Ï S then name t as s k S S È { s k } record s j s k on x k k + 1 else t is s m Î S record s j s m on x t is already in CC; it is some state s m add transition to DFA

Example from SheepNoise Starts with S 0 S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } s 0 closure ( [S S,EOF] ) S { s 0 } k 1 0 0 Goal Goal SheepNoise 1 1 SheepNoise SheepNoise baa baa 2 2 baa baa

Example from SheepNoise Starts with S 0 S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } Iteration 1 computes S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } while ( S is still changing ) " s j Î S and " x Î ( T È NT ) t goto(s j,x) 0 0 Goal Goal SheepNoise 1 1 SheepNoise SheepNoise baa baa 2 2 baa baa

Example from SheepNoise Starts with S 0 S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } Iteration 1 computes S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } 0 0 Goal Goal SheepNoise 1 1 SheepNoise SheepNoise baa baa 2 2 baa baa

Example from SheepNoise S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } Nothing more to compute, since is at the end of every item in S 3. Iteration 2 computes S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } 0 0 Goal Goal SheepNoise 1 1 SheepNoise SheepNoise baa baa 2 2 baa baa

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa

Filling in the ACTION and GOTO Tables The algorithm " set S x Î S " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k Fill ACTION table

Filling in the ACTION and GOTO Tables The algorithm x is the state number " set S x Î S " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k

Filling in the ACTION and GOTO Tables The algorithm " set S x Î S before T Þ shift " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k

Filling in the ACTION and GOTO Tables The algorithm " set S x Î S " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k have Goal Þ accept

Filling in the ACTION and GOTO Tables The algorithm " set S x Î S " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k at end Þ reduce

Filling in the ACTION and GOTO Tables The algorithm " set S x Î S " item i Î S x if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k else if i is [S S,EOF] then ACTION[x,EOF] accept else if i is [A b,a] then ACTION[x,a] reduce A b " n Î NT if goto(s x,n) = S k then GOTO[x,n] k Fill GOTO table

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], before T Þ shift k [SheepNoise baa, baa] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa if i is [A b ad,b] and goto(s x,a) = S k, a Î T [SheepNoise SheepNoise baa, baa] } then ACTION[x,a] shift k

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = before T Þ shift k { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } so, ACTION[s 0,baa] is shift S 2 (clause 1) (items define same entry) S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } so, ACTION[S 1,baa] is shift S 3 (clause 1) S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa if i is [A b ad,b] and goto(s x,a) = S k, a Î T then ACTION[x,a] shift k

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } so, ACTION[S 1,EOF] is accept (clause 2) S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa else if i is [S S,EOF] [SheepNoise SheepNoise baa, baa] } then ACTION[x,EOF] accept

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } S 1 = Goto(S 0, SheepNoise) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } ACTION[S 2,baa] is reduce 2 (clause 3) [SheepNoise SheepNoise baa, baa] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa so, ACTION[S 2,EOF] is reduce 2 (clause 3) else if i is [A b,a] then ACTION[x,a] reduce A b

Example from SheepNoise S 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } ACTION[S S 1 = Goto(S 3,EOF] 0, SheepNoise) = reduce 1 (clause 3) { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } ACTION[S 3,baa] is reduce 1, as well 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa else if i is [A b,a] then ACTION[x,a] reduce A b

Example from SheepNoise The GOTO Table records Goto transitions on NTs s 0 : { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa], [SheepNoise baa, baa] } s 1 = Goto(S 0, SheepNoise) = Puts s 1 in GOTO[s 0,SheepNoise] { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } s 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], [SheepNoise baa, baa] } Based on T, not NT and written into the ACTION table s 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa Only 1 transition in the entire GOTO table Remember, we recorded these so we don t need to recompute them.

ACTION & GOTO Tables Here are the tables for the SheepNoise grammar The tables ACTION TABLE State EOF baa 0 shift 2 1 accept shift 3 2 reduce 2 reduce 2 3 reduce 1 reduce 1 GOTO TABLE State SheepNoise 0 1 1 0 2 0 3 0 The grammar 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa

What can go wrong? Shift/reduce error What if set s contains [A b ag,b] and [B b,a]? First item generates shift, second generates reduce Both set ACTION[s,a] cannot do both actions This is ambiguity, called a shift/reduce error Modify the grammar to eliminate it Shifting will often resolve it correctly (if-then-else)

What can go wrong? Reduce/reduce conflict What is set s contains [A g, a] and [B g, a]? Each generates reduce, but with a different production Both set ACTION[s,a] cannot do both reductions This ambiguity is called reduce/reduce conflict Modify the grammar to eliminate it (PL/I s overloading of (...)) In either case, the grammar is not LR(1)

Summary LR(1) items Creating ACTION and GOTO table What can go wrong?