LR(1) Parsers Part III Last Parser Lecture Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved.
LR(1) Parser Recap Bottom-up conceptual algorithm LR(1) Skeleton Parser Construct Control DFA Closure and goto functions Today Construct ACTION AND GOTO tables
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
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
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
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
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 x is the state number set S x CC item i S x if i is [A β aδ,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 β,a] then ACTION[x,a] reduce A β 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 CC before T shift item i S x if i is [A β aδ,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 β,a] then ACTION[x,a] reduce A β 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 CC item i S x if i is [A β aδ,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 β,a] then ACTION[x,a] reduce A β 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 CC item i S x if i is [A β aδ,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 β,a] then ACTION[x,a] reduce A β 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 CC item i S x if i is [A β aδ,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 β,a] then ACTION[x,a] reduce A β 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 β aδ,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 β aδ,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 [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 else if i is [A β,a] then ACTION[x,a] reduce A β
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) = else if i is [A β,a] then ACTION[x,a] reduce A β [SheepNoise baa, baa] } { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } S 2 = Goto(S 0, baa) = { [SheepNoise baa, EOF], S 3 = Goto(S 1, baa) = { [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } ACTION[S 3,EOF] is reduce 1 0 Goal SheepNoise 1 SheepNoise SheepNoise baa 2 baa ACTION[S 3,baa] is reduce 1, as well
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) = { [Goal SheepNoise, EOF], [SheepNoise SheepNoise baa, EOF], [SheepNoise SheepNoise baa, baa] } Puts s 1 in GOTO[s 0,SheepNoise] 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 β aγ,b] and [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 γ, a] and [B γ, 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)
CYK Parser Simple context-free-language parser Worse-case running time is O(n 3 ), space is O(n 2 ) Employs bottom-up parsing and dynamic programming Shunned for many years Even tabular methods [CYK, Earley] should be avoided if the language at hand has a grammar for which more efficient algorithms [LL, LALR] are available. The Theory of Parsing., Aho, Ullman, 1972 But in practice, running time is more like O(n 1.2 ) - Plus computers are now 1,000,000-times faster than in 1972 - And (more importantly) CYK parser is easily parallelizable! Source: Ras Bodik, Slides: Browsing Web 3.0 on 3.0 Watts
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
CYK Parser (Sequential Version)
The CYK Parser Algorithm (Sequential Version)
Phase IV: Semantic Checking