12/k Tentamen Compilers (2M220) 19 maart 2002, 9.00u-12.00u 1. Beschouw de volgende deelverzameling van de ASCII-karakters V = { 0, 1,..., 9, A, B,..., Y, Z, a, b,..., y, z } De karakters in V staan vermeld in de volgorde zoals ze, van laag naar hoog, voorkomen in de ordening van de ASCII-karakters. Dit is ook de ordening binnen de verzameling V. De representatie van een deelverzameling van V bestaat uit achtereenvolgens het karakter [ eventueel het karakter ^ (al of niet complement) 0ofméér keren -óf 1 karakter uit V (los karakter) -óf 1 karakter uit V, gevolgd door het karakter - (koppelteken), gevolgd door 1 karakter uit V (karakterinterval, d.w.z. alle karakters in de ordening tussen het eerste en het tweede karakter) het karakter ] Aanwezigheid van het karakter ^ duidt aan dat het complement (t.o.v. V ) van de bedoelde deelverzameling wordt beschreven. De gerepresenteerde verzameling bestaat uit alle losse karakters en alle karakters in de karakterintervallen in de representatie (of juist het complement daarvan t.o.v. V als het karakter ^ aanwezig is). Enkele voorbeelden representatie deelverzameling [] [a-z] { a, b,..., y, z } [^a-z] { 0, 1,..., 9, A, B,..., Y, Z } [^] V [0-z] V [0A-C7-9Za] { 0, 7, 8, 9, A, B, C, Z, a } [^0-9A-Z] { a, b,..., y, z } (1) (a) Geef een reguliere expressie e die representaties van deelverzamelingen van V volgens bovenstaande regels beschrijft en voldoet aan det(e, { }). (1) (b) Construeer uit de als antwoord bij (a) gegeven reguliere expressie volgens het T- recept een acceptorprogramma in GCL. U mag daarbij de gebruikelijke vereenvoudigingen toepassen en hoeft alleen het eindresultaat te geven. 1
2. Beschouw de volgende contextvrije grammatica voor boolse expressies S EXPR EXPR EXPR or EXPR EXPR cor EXPR EXPR and EXPR EXPR cand EXPR ( EXPR ) ID not ID true false ID a b c d (1) (a) Geef Follow(EXPR), LA(EXPR EXPR or EXPR), LA(EXPR not ID) en LA(EXPR ID). (1) (b) Waarom voldoet bovenstaande grammatica niet aan de LL(1)-eisen? Beschrijf de taal voortgebracht door deze grammatica (als S als startsymbool wordt genomen) door een LL(1)-grammatica die tevens uitdrukt dat operatoren and en cand dezelfde prioriteit hebben, dat operatoren or en cor dezelfde prioriteit hebben en dat de prioriteit van and/cand hoger is dan die van or/cor. (1) (c) Geef de recursive descent parsing procedures in GCL behorend bij de LL(1)- grammatica uit uw antwoord op vraag (b). Ga daarbij uit van een lexical scanner geïmplementeerd middels een procedure NEXTSYM die aan een globale variabele sym het eerstvolgende token toekent volgens het volgende schema "or" orsym "cor" corsym "and" andsym "cand" candsym "not" notsym a b c d idsym "true" truesym "false" falsesym (1) (d) De operatoren or en and zijn de bekende boolse operatoren met vertalingen τ EXPR (e 1 or e 2 )α τ EXPR (e 1 and e 2 )α = = τ EXPR (e 1 )α τ EXPR (e 1 )α τ EXPR (e 2 )α τ EXPR (e 2 )α OR AND De operator cor is de conditionele or-operator en de operator cand is de conditionele and-operator. Deze operatoren zijn als volgt gedenieerd: (i) true cor e = true (iii) false cand e = false (ii) false cor e = e (iv) true cand e = e waarbij het in gevallen (i) en (iii) is toegelaten dat expressie e niet te berekenen is (berekening leidt tot abortie, denk bijv. aan delen door 0). Voor de berekening van 2
e 1 cor e 2 resp. e 1 cand e 2 wordt eerst e 1 berekend en, als dat nodig is (gevallen (ii) en (iv)), e 2. Geef denities van de vertalingen τ EXPR (e 1 cor e 2 )α en τ EXPR (e 1 cand e 2 )α die overeenstemmen met de gegeven semantiek van de operatoren cor en cand. De TL-interpretator is als bijlage toegevoegd. 3. Aan de voorbeeldtaal PL worden for-statements toegevoegd beschreven door de volgende productieregel STAT for ID := EXPR until EXPR do STATS od Nonterminal ID brengt op niet nader gespeciceerde wijze identiers voort. Het forstatement for x := e b until e e do ss od moet voldoen aan de volgende contextcondities variabele x is een verse variabele, d.w.z. x komt niet voor in de declaraties en x is niet geïntroduceerd door een omhullend for-statement (denk aan nesting van for-statements) x mag als variabele van het type int gebruikt worden in statements ss, maar niet in expressies e b en e e (het for-statement declareert als het ware een extra variabele x van het type int) expressies e b en e e zijn van het type int en heeft een semantiek die gelijk is aan die van binnenblok [ var x : int, eind : int x := e b ; eind := e e ; while x eind do ss; x := x +1od ] (1) (a) Geef een geattribueerde versie van bovenstaande productieregel met bijbehorende regelcondities die de gegeven contextcondities uitdrukt. Ga er vanuit dat de nonterminals als volgt geattribueerd zijn: STAT D, ID +Name, EXPR D, +Type en STATS D waarin D = bag of Name Type (hint: Beschouw het inherited attribuut van STATS en STAT als de bag van alle gedeclareeerde variabelen aangevuld met alle (integer)variabelen die door omhullende for-statements zijn geïntroduceerd). (1) (b) Geef een vertaling naar TL van dit for-statement, d.w.z. geef een correcte denitie van τ STAT (for x := e b until e e do ss od)α, ffa waarin de extra parameter ffa van de vertaalfunctie aangeeft vanaf welk adres cellen in het datageheugen beschikbaar zijn voor de opslag van tijdelijke extra variabelen. De TL-interpretator (uitgebreid met o.a. instructie INC) is als bijlage toegevoegd. 3
4. Aan voorbeeldtaal PL worden case-expressies toegevoegd beschreven door de volgende productieregel EXPR ( EXPR? EXPR {: EXPR} EXPR ) De case-expressie e =(e 0? e 1 : e 2 : : e k e k+1 ) moet voldoen aan de volgende contextcondities e 0 moet het type int hebben e 1, e 2,..., e k en e k+1 moeten hetzelfde type hebben en dit type is ook het type van de hele expressie en heeft als waarde val(e) = { val(ei ) als val(e 0 )=i en 1 i k val(e k+1 ) anders (1) (a) Geef een geattribueerde versie van bovenstaande productieregel met bijbehorende regelcondities die de gegeven contextcondities uitdrukt. Ga er daarbij vanuit dat de nonterminal EXPR als volgt geattribueerd is: EXPR D, +Type met D = bag of Name Type. (1) (b) Geef een vertaling naar TL van deze expressie, d.w.z. geef een correcte denitie van τ EXPR ((e 0? e 1 : e 2 : : e k e k+1 ))α beoordeling De punten per (deel)opgave staan in de marge vermeld. Het cijfer wordt als volgt bepaald: (som van behaalde punten + evt. behaald bonuspunt) min 10 waarin met bonuspunt wordt bedoeld het punt behaald met de opdrachten in het studiejaar 2001/2002. (Voltooiïng van opdrachten 1, 2 en 3 tezamen levert 1 bonuspunt, voltooiïng van opdracht 4 een 1 2 bonuspunt.) Het bonuspunt behaald in studiejaar 2001/2002 telt mee voor alle tentamens in dat zelfde studiejaar. 4
TL-interpretator var run : Bool ; in : Instr; v, v 1,v 2 : Value ; l : Plabel ; m : Memaddress es, ip, run, rs, ds, ffa :=, 0, true,,, 0 ; do run in := P [ ip]; ip := ip +1 ; case in of SUB ADD MUL DIV MOD : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; if v 1,v 2 :: iv(x 1 ),iv(x 2 ) es := iv(x 2 x 1 ) es [] v 1,v 2 :: rv(y 1 ),rv(y 2 ) es := rv(y 2 y 1 ) es : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; if v 1,v 2 :: iv(x 1 ),iv(x 2 ) es := iv(x 2 mod x 1 ) es INC : v, es := Top(es),Pop(es) ; if v :: iv(x) if x < MaxInt es := iv(x +1) es [] v :: rv(y) if x < MaxReal 1 es := rv(y +1) es [] v :: bv(z) if z es := bv( z) es [] v :: cv(c) if ord(c) < 255 es := cv(chr(ord(c) + 1)) es DEC EQL : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; es := bv(v 1 = v 2 ) es NEQ : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; es := bv(v 1 v 2 ) es LEQ : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; if v 1,v 2 :: iv(x 1 ),iv(x 2 ) es := bv(x 2 x 1 ) es [] v 1,v 2 :: rv(y 1 ),rv(y 2 ) es := bv(y 2 y 1 ) es [] v 1,v 2 :: bv(z 1 ),bv(z 2 ) es := bv(z 2 z 1 ) es [] v 1,v 2 :: cv(c 1 ),cv(c 2 ) es := bv(c 2 c 1 ) es LESS GEQ GTR AND : v 1,v 2,es := Top(es),Top Pop(es),Pop Pop(es) ; if v 1,v 2 :: bv(z 1 ),bv(z 2 ) es := bv(z 2 z 1 ) es OR 5
NEG : v, es := Top(es),Pop(es) ; if v :: iv(x) es := iv( x) es [] v :: rv(y) es := rv( y) es [] v :: bv(z) es := bv( z) es STO(m) : M[m],es := Top(es),Pop(es) LDV(m) : es := M[m] es LDI : v, es := Top(es),Pop(es) ; if v :: iv(x) es := M[x] es STI : v 1,v 2,es:= Top(es),Top Pop(es),Pop Pop(es) ; if v 2 :: iv(x) M[x] :=v 1 LDC(v) : es := v es DUP : es := Top(es) es POP : es := Pop(es) PUT : es, out := Pop(es), out Top(es) GET : es, inp := First(inp) es, Rest(inp) CHK(v 1,v 2 ) : v := Top(es) ; if v 1,v 2,v :: iv(x 1 ),iv(x 2 ),iv(x) es := bv(x 1 x x x 2 ) es TJP(l) : v, es := Top(es),Pop(es) ; if v :: bv(z) if z ip := Lmap(l) [] z skip FJP(l) UJP(l) XJP HLT : v, es := Top(es),Pop(es) ; if v :: bv(z) if z skip [] z ip := Lmap(l) : ip := Lmap(l) : v, es := Top(es),Pop(es) ; if v :: iv(x) ip := ip 1+x : run := false od esac 6