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

Similar documents
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, VI Examples from LR Parsing. Comp 412

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

Parsing VI LR(1) Parsers

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.

CS415 Compilers Syntax Analysis Bottom-up Parsing

Computer Science 160 Translation of Programming Languages

Lexical Analysis Part II: Constructing a Scanner from Regular Expressions

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

CS415 Compilers Syntax Analysis Top-down Parsing

Syntactic Analysis. Top-Down Parsing

Syntax Analysis Part I

Material Covered on the Final

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

Parsing -3. A View During TD Parsing

Compiling Techniques

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

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

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.

Construction of Static Single-Assignment Form

CS 406: Bottom-Up Parsing

CS 314 Principles of Programming Languages

Compiler Design Spring 2017

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

Syntax Analysis Part I

CMSC 330: Organization of Programming Languages. Pushdown Automata Parsing

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

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

Lexical Analysis: DFA Minimization & Wrap Up

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

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

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

THEORY OF COMPILATION

CA Compiler Construction

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

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

Compiling Techniques

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 }

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

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

Context free languages

Syntax Analysis (Part 2)

Compiler Construction Lectures 13 16

Introduction to Bottom-Up Parsing

Compiler Construction Lent Term 2015 Lectures (of 16)

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

Compiler Construction Lent Term 2015 Lectures (of 16)

Computing if a token can follow

Bottom-Up Syntax Analysis

Syntax Analysis - Part 1. Syntax Analysis

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

Introduction to Bottom-Up Parsing

Chapter 4: Bottom-up Analysis 106 / 338

Why augment the grammar?

Introduction to Bottom-Up Parsing

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

Syntax Analysis Part III

Introduction to Bottom-Up Parsing

MA/CSSE 474 Theory of Computation

CONTEXT FREE GRAMMAR AND

CSE302: Compiler Design

Lexical Analysis. DFA Minimization & Equivalence to Regular Expressions

CS20a: summary (Oct 24, 2002)

Syntax Directed Transla1on

Follow sets. LL(1) Parsing Table

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

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)

Compiling Techniques

INF5110 Compiler Construction

Context-Free Grammars (and Languages) Lecture 7

Translator Design Lecture 16 Constructing SLR Parsing Tables

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)

Top-Down Parsing and Intro to Bottom-Up Parsing

Lecture 11 Context-Free Languages

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

Compiling Techniques

Beyond Superlocal: Dominators, Data-Flow Analysis, and DVNT. COMP 506 Rice University Spring target code. source code OpJmizer

FORMAL LANGUAGES, AUTOMATA AND COMPUTABILITY

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.

Syntactical analysis. Syntactical analysis. Syntactical analysis. Syntactical analysis

Computer Science 160 Translation of Programming Languages

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

Everything You Always Wanted to Know About Parsing

Announcement: Midterm Prep

INF5110 Compiler Construction

CS153: Compilers Lecture 5: LL Parsing

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

CPS 220 Theory of Computation

Compiler Construction

Creating a Recursive Descent Parse Table

Context Free Grammars

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

Lecture 10: Data Flow Analysis II

Static Program Analysis

Bottom-Up Syntax Analysis

Deterministic Finite Automaton (DFA)

Introduction to Theory of Computing

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

Transcription:

COMP 412 FALL 2018 Syntax Analysis, VII The Canonical LR(1) Table Construction Comp 412 source code IR IR target Front End Optimizer Back End code Copyright 2018, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice University have explicit permission to make copies of these materials for their personal use. Faculty from other educational institutions may use these materials for nonprofit educational purposes, provided this copyright notice is preserved. Chapter 3 in EaC2e

Table-Driven LR Parsers A table-driven LR(1) parser is a bottom-up shift-reduce parser Scanner <word, category> pairs Skeleton LR Parser Action & Goto Tables IR Knowledge encoded in tables to drive skeleton specifications (as a CFG) LR(1) Parser Generator Grammatical knowledge is encoded in two tables: Action & Goto They encode the handle-finding automaton They are constructed by an LR(1) parser generator Why two tables? Reduce needs more information & more complex information than shift Goto holds that extra information COMP 412, Fall 2018 1

Table-Driven LR Parsers A table-driven LR(1) parser is a bottom-up shift-reduce parser Design Time Scanner <word, category> pairs specifications (as a CFG) Skeleton LR Parser Action & Goto Tables LR(1) Parser Generator Knowledge encoded in tables to drive skeleton IR Compile Time Build Time Back to the Meta Issue The compiler writer creates a grammar at design time The parser generator builds ACTION and GOTO tables at build time The compiler uses those tables to parse at compile time COMP 412, Fall 2018 2

Building LR(1) Tables How do we generate the ACTION and GOTO tables? Use the grammar to build a model of the Control DFA Encode actions & transitions in ACTION & GOTO tables If construction succeeds, the grammar is LR(1) Succeeds means defines each table entry uniquely An operational definition The Big Picture Model the state of the parser with LR(1) items Use two functions goto(s, X) and closure(s) goto() is analogous to move() in the subset construction grammar symbol, T or NT Given a partial state, closure() adds all the items implied by the partial state Build up the states and transition functions of the DFA Use this information to fill in the ACTION and GOTO tables fixed-point algorithm, similar to the subset construction COMP 412, Fall 2018 3

LR(1) Table Construction To understand the algorithms, we need to understand the data structure that they use: LR(1) items We call the placeholder 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 single symbol lookahead (symbol word or EOF) The LR(1) table construction algorithm models a configuration of the parser, or a state of the parser, as a set of LR(1) items Each item represents a specific production by which the parser might reuce in the future Each item s placeholder represents the progress toward that reduction The construction ties builds up a set of configurations that model all the possible behaviors implied by the grammar COMP 412, Fall 2018 4

LR(1) Items The intermediate representation of the LR(1) table construction algorithm 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 single symbol lookahead (symbol word or EOF) The in an item indicates the position of the top of the stack [A bg,a] means that the input seen so far is consistent with the use of A bg immediately after the symbol on top of the stack. We call an item like this a possibility. [A b g,a] means that the input sees so far is consistent with the use of A bg at this point in the parse, and that the parser has already recognized b (that is, b is on top of the stack). We call an item like this a partially complete item. [A bg,a] means that the parser has seen bg, and that a lookahead symbol of a is consistent with reducing to A. This item is complete. LR(k) parsers rely on items with a lookahead of k symbols. COMP 412, Fall 2018 5 That leads to LR(k) items, with correspondingly longer d.

LR(1) Items The production A b, where b = B 1 B 2 B 3 with lookahead a, can give 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. What s the point of all these lookahead symbols? Carry them along to help choose the correct reduction Lookaheads are bookkeeping, unless item has at right end Has no direct use in [A b g,a] In [A b,a], a lookahead of a implies a reduction by A b For { [A b,a],[b g d,b] }, a Þ reduce to A; FIRST(d) Þ shift Þ Limited right context is enough to pick the actions a FIRST(d) Þ a conflict, not LR(1) COMP 412, Fall 2018 6

LR(1) Items The set of LR(1) items for a grammar is finite Consider the SheepNoise grammar 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa It gives rise to 7 LR(1) items Prod [Goal SheepNoise] [Goal SheepNoise ] 0 [Goal SheepNoise baa] [Goal SheepNoise baa] [Goal SheepNoise baa ] 1 [Goal baa] [Goal baa ] 2 7 is finite. Why does this matter? A configuration of the LR(1) parser is represented as a set of LR(1) items the collection of productions by which the parser might reduce in the future, given the context seen so far, with the placeholder showing the progress in recognizing each production. The number of such states is, again, finite. COMP 412, Fall 2018 7

LR(1) Items: Why should you know this stuff? Debugging a grammar When you build an LR(1) parser, it is possible (likely) that the initial grammar is not LR(1) The tools will provide you with debugging output To the right is a sample of bison s output for the if-then-else grammar state 10 4 stmt : IF EXPR THEN stmt. 5 IF EXPR THEN stmt. ELSE stmt ELSE shift, and go to state 11 ELSE [reduce using rule 4 (stmt)] $default reduce using rule 4 (stmt) That period is the goal : stmt_list stmt_list : stmt_list stmt stmt stmt : IF EXPR THEN stmt IF EXPR THEN stmt ELSE stmt OTHER The state is described by its LR(1) items COMP 412, Fall 2018 8

LR(1) Table Construction High-level overview 1 Build the Canonical Collection of Sets of LR(1) Items, I a Begin in an appropriate state, s 0 [S S,EOF], along with any equivalent items Derive equivalent items as closure( s 0 ) b Repeatedly compute, for each s k, and each X, goto(s k,x) If the set is not already in the collection, add it Record all the transitions created by goto( ) This eventually reaches a fixed point S is the start symbol. If needed, we add S S to create a unique goal production. goto(s i, X) contains the set of LR(1) items that represent possible parser configurations if the parser recognizes an X while in state s i 2 Fill in the table from the Canonical Collection of Sets of LR(1) items The sets in the canonical collection form the states of the Control DFA. The construction traces the DFA s transitions COMP 412, Fall 2018 9

LR(1) Table Construction High-level overview 1 Build the Canonical Collection of Sets of LR(1) Items, I a Begin in an appropriate state, s 0 [S S,EOF], along with any equivalent items Derive equivalent items as closure( s 0 ) b Repeatedly compute, for each s k, and each X, goto(s k,x) If the set is not already in the collection, add it Record all the transitions created by goto( ) This eventually reaches a fixed point 2 Fill in the table from the Canonical Collection of Sets of LR(1) items Let s build the tables for the left-recursive SheepNoise grammar 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa (S is Goal) COMP 412, Fall 2018 10

Computing Closures Closure(s) adds all the possibilities for the items already in s Any item [A b Bd,a] where B Î NT implies [B t,x] for each production that has B on the lhs, and each x Î FIRST(da) Since bbd is valid, any way to derive bbd is valid, too The Algorithm Closure( s ) while ( s is still changing ) " items [A b Bd,a] Î s lookahead FIRST(da) // d might be e " productions B t Î P " b Î lookahead if [B t,b] Ï s then s s È { [B t,b] } Classic fixed-point method Halts because s Ì I, the set of all items (finite) Worklist version is faster Closure fills out a state s Generate new lookaheads. See note on p. 128 COMP 412, Fall 2018 11

Computing Closures Generating Closures is the place where a human is most likely to make a mistake With everything going on in the construction, it is easy to lose track of!a and the fact that it refers to the item, not the current production Closure( s ) while ( s is still changing ) " items [A b Bd,a] Î s " productions B t Î P " b Î FIRST(da) // d might be e if [B t,b] Ï s then s s È { [B t,b] } The lookahead computation is a great example of why these table constructions should be done by computers, not human beings COMP 412, Fall 2018 12

This is the left-recursive SheepNoise; EaC2e shows the right-recursive version. Example From SheepNoise Initial step builds the item [Goal SheepNoise, EOF] and takes its Closure( ) Closure( [Goal SheepNoise, EOF] ) Item [Goal SheepNoise, EOF] [SheepNoise SheepNoise baa, EOF] [SheepNoise baa, EOF] [SheepNoise SheepNoise baa, baa] [SheepNoise baa, baa] Source Original item ITER 1, PR 1, da is EOF ITER 1, PR 2, da is EOF ITER 2, PR 1, da is baa EOF ITER 2, PR 2, da is baa EOF So, S 0 is { [Goal SheepNoise,EOF], [SheepNoise SheepNoise baa,eof], [SheepNoise baa,eof], [SheepNoise SheepNoise baa,baa], [SheepNoise baa,baa] } Symbol 0 Goal SheepNoise 1 SheepNoise SheepNoise baa COMP 412, Fall 2018 2 baa 13 FIRST Goal { baa } SheepNoise { baa } baa { baa } EOF { EOF }

Computing Gotos Goto(s,x) computes the state that the parser would reach if it recognized an x while in state s Goto( { [A b Xd,a] }, X ) produces {[A bx d,a]} (obviously) It finds all such items & uses Closure() to fill out the state The Algorithm Goto( s, X ) new Ø " items [A b Xd,a] Î s new new È {[A bx d,a]} return Closure( new ) Goto( ) models a transition in the automaton Straightforward computation Goto() is not a fixed-point method (but it calls Closure()) COMP Goto412, in this Fall construction 2018 is analogous to Move in the subset construction. 14

Example from SheepNoise Assume that 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 From earlier slide 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] 0 Goal SheepNoise 1 SheepNoise SheepNoise baa COMP 412, Fall 2018 2 baa 15

Building the Canonical Collection Start from s 0 = Closure( [S S,EOF] ) Repeatedly construct new states, until all are found The Algorithm s 0 Closure( { [S S,EOF] } ) S { s 0 } k 1 while (S is still changing) " s j Î S and " x Î (T È NT ) s k Goto(s j,x) record s j s k on x if s k Ï S then S S È { s k } k k + 1 Fixed-point computation Loop adds to S (monotone) S Í 2 ITEMS, so S is finite Worklist version is faster because it avoids duplicated effort This membership / equality test requires careful and/or clever implementation. COMP 412, Fall 2018 16

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] } Iteration 2 computes S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } Nothing more to compute, since is at the end of every item in S 3. 0 Goal SheepNoise 1 SheepNoise SheepNoise baa COMP 412, Fall 2018 2 baa 17

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] } State SN baa 0 Goal SheepNoise 1 SheepNoise SheepNoise baa s 0 s 1 s 2 s 1 s 3 s 2 s 3 Goto Relationships 2 COMP 412, Fall 2018 baa 18

Filling in the ACTION and GOTO Tables The Table Construction 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 before T Þ shift have Goal Þ accept at end Þ reduce Many items generate no table entry Placeholder before a NT does not generate an ACTION table entry Closure( ) instantiates FIRST(X) directly for [A b Xd,a] COMP 412, Fall 2018 19

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] } S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } so, ACTION[s 0,baa] is shift S 2 (clause 1) (items define same entry) COMP 412, Fall 2018 20

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] } COMP 412, Fall 2018 21

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,EOF] is accept (clause 2) S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } COMP 412, Fall 2018 22

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] } so, ACTION[S 2,EOF] is reduce 2 (clause 3) (baa, too) ACTION[S 3,EOF] is reduce 1 (clause 3) (baa, too) COMP 412, Fall 2018 23

Building the Goto Table 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] } State SN baa The Goto table holds just the entries for nonterminal symbols. (the baa column went into Action) s 0 s 1 s 2 s 1 s 3 s 2 s 3 Goto Relationships COMP 412, Fall 2018 24

ACTION & GOTO Tables Here are the tables for the left-recursive 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 COMP Remember, 412, Fall this 2018 is the left-recursive SheepNoise; EaC2e shows the right-recursive version. 25

What can go wrong? The if-then-else grammar is worked as an example in EaC2e What if a set s contains [A b ag,b] and [B b,a]? First item generates shift, second generates reduce Both define ACTION[s,a] cannot do both actions This is a fundamental ambiguity, called a shift/reduce error or conflict Modify the grammar to eliminate it Shifting will often resolve it correctly (if-then-else) What if a set s contains [A g, a] and [B g, a]? Each generates reduce, but with a different production Both define ACTION[s,a] cannot do both reductions This is a fundamental ambiguity, called a reduce/reduce error or conflict Modify the grammar to eliminate it (PL/I s overloading of (...)) In either case, the grammar is not LR(1) COMP 412, Fall 2018 26

Implementing the Construction Building the Canonical Collection Remember this comment about implementing the equality test at the Start from s 0 = closure( [S S,EOF] ) bottom of the algorithm to build the Repeatedly construct new states, until Canonical all are found Collection of Sets of LR(1) The algorithm s 0 closure( [S S,EOF]) S { s 0 } k 1 while (S is still changing) " s j Î S and " x Î (T È NT ) s k goto(s j,x) record s j s k on x if s k Ï S then S S È { s k } k k + 1 Items? Only need to compare core items the rest will follow Fixed-point computation Represent items as a triple (R,P,L) Loop adds to S - R is the rule or production -S ÍP is 2the ITEMS position, so S is of finite the placeholder - L is the lookahead symbol Worklist version is faster Order items, then because it avoids duplicated effort 1. Compare set cardinalities 2. Compare (in order) by R, P, L This membership / equality test requires careful and/or clever implementation. STOP COMP 412, Fall 2018 27