Lesson 13 CDT301 – Compiler Theory, Spring 2011 Teacher: Linus Källberg.
Compiler Theory – 08/10( ppt )
description
Transcript of Compiler Theory – 08/10( ppt )
![Page 1: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/1.jpg)
Compiler Theory – 08/10(ppt)
By Anindhya Sankhla11CS30004
Group : G 29
![Page 2: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/2.jpg)
Canonical LR(1) items
• The canonical collection of LR(1) items: set of items derivable from [S’ ::= S; eof] set of all items that can derive the final
configuration Speak in a normal tone of voice, and listen
attentively.
• Essentially each set in the canonical collection of sets of
LR(1) items represents a state in an NFA that recognizes viable prefixes.
Grouping together is really the subset construction.
![Page 3: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/3.jpg)
Canonical LR(1) items
To construct the canonical collection we need two functions :
• closure (I )
• goto(I , X)
![Page 4: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/4.jpg)
LR(1) closure
Given an item [A ::= α Bβ,a], its closure contains the item and any other items that can generate legal substrings to follow α.
Thus, if the parser has viable prefix α on its stack, the input should reduce to B β (or γ for some other item [B ::= γ b] in the closure).
![Page 5: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/5.jpg)
To compute closure(I)
function closure(I) repeat new_item ←false for each item [A ::= α Bβ,a] ϵ I, each production B ::= γ ϵ G’, and each terminal b ϵ FIRST(βa), if [B ::= γ,b] Ɇ I then add [B ::= γ,b] to I new_item ← true endif until (new_item = false) return I.
![Page 6: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/6.jpg)
LR(1) goto
• Let I be a set of LR(1) items and X be a grammar symbol.
• Then, goto(I,X) is the closure of the set of all items
[A ::= αX β, a] such that [A ::= α Xβ,a] ϵ I
• If I is the set of valid items for some viable prefix γ, then goto(I,X) is the set of valid items for the viable prefix γX.
• goto(I,X) represents state after recognizing X in state I .
![Page 7: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/7.jpg)
To compute goto(I,X)
function goto(I,X)
J ← set of items [A ::= αX β, a]
such that [A ::= α Xβ,a] ϵ I
J’ ← closure(J)
return J’
![Page 8: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/8.jpg)
Collection of sets of LR(1) items• We start the construction of the collection of
sets of LR(1) items with the item [S’ ::= S,eof], where
S’ is the start symbol of the augmented
grammar G’
S is the start symbol of G, and
eof is the right end of string marker
![Page 9: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/9.jpg)
To compute the collection of sets of LR(1) items
procedure items(G’) C ← {closure( {[S’ ::= S; eof]} )} repeat new_item ← false for each set of items I in C and each grammar symbol X such that goto(I , X) ≠ ϕ and goto(I , X) Ɇ C add goto(I , X) to C new_item ← true endfor until (new_item = false)
![Page 10: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/10.jpg)
LR(1) table construction• The Algorithm:1. construct the collection of sets of LR(1) items for
G’.2. State i of the parser is constructed from Ii .3. (a) if [A ::= α aβ, b] ϵ Ii and goto(Ii,a) = Ij, then
set action[i, a] to “shift j”. (a must be a terminal)
(b) if [A ::= α , a] ϵ Ii, then set action[i, a] to “reduce A ::= α”. (c) if [S’ ::= S , eof] ϵ Ii , then set action[i,eof] to “accept”.3. If goto(Ii, A) = Ij, then set goto[i, A] to j.4. All other entries in action and goto are set to “error”5. The initial state of the parser is the state constructed from the set containing the item [S’ ::= S; eof].
![Page 11: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/11.jpg)
Example : The Grammar
1. goal ::= expr
2. expr ::= term + expr
3. | term
4. term ::= factor * term
5. | factor
6. factor ::= id
![Page 12: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/12.jpg)
Example: ACTION and GOTO Table
ACT ION GOTO
id + * eof expr term factor
S0 s4 - - - 1 2 3
S1 - - - acc - - -
S2 - - - r3 - - -
S3 - r5 s6 r5 - - -
S4 - r6 r6 r6 - - -
S5 s4 - - - 7 2 3
S6 s4 - - - - 8 3
S7 - - - r2 - - -
S8 - r4 - r4 - - -
![Page 13: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/13.jpg)
Example
• Step 1
I0 ← {[g ::= e, eof ]}
I0 ← closure(I0)
{ [g ::= e, eof], [e ::= t + e, eof],
[e ::= t, eof], [t ::= f * t, +],
[t ::= f * t, eof], [t ::= f, +],
[t ::= f, eof], [f ::= id, +],
[f ::= id, eof] }
![Page 14: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/14.jpg)
Example• Iteration 1 I1 ← goto(I0, e) I2 ← goto(I0, t) I3 ← goto(I0, f) I4 ← goto(I0, id)
• Iteration 2 I5 ← goto(I2 ,+) I6 ← goto(I3 ,*)
• Iteration 3 I7 ← goto(I5, e) I8 ← goto(I6, t)
![Page 15: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/15.jpg)
Example• I0: [g ::= e, eof], [e ::= t + e, eof], [e ::= t, eof], [t ::= f * t, {+, eof}], [t ::= f, {+, eof}], [f ::= id, {+, eof}]• I1: [g ::= e , eof]• I2: [e ::= t , eof], [e ::= t + e, eof]• I3: [t ::= f , {+, eof}], [t ::= f * t, {+, eof}]• I4: [f ::= id , {+, *, eof}]• I5: [e ::= t + e, eof], [e ::= t + e, eof], [e ::= t, eof], [t ::= f * t, {+, eof}], [t ::= f, {+, eof}], [f ::= id, {+, *, eof}]• I6: [t ::= f * t, {+, eof}], [t ::= f * t,{+, eof}], [t ::= f, {+, eof}], [f ::= id, {+, *, eof}]• I7: [e ::= t + e , eof]• I8: [t ::= f * t , {+, eof}]
![Page 16: Compiler Theory – 08/10( ppt )](https://reader030.fdocuments.us/reader030/viewer/2022013103/56813ded550346895da7c60a/html5/thumbnails/16.jpg)
THANK YOU FOR YOUR ATTENTION !