Kompilatorer och interpretatorer: Lecture 14

Några övningsuppgifter.

Uppgift 1: Faser och pass

Vad är en fas? Vad är ett pass?

Uppgift 2: Symboltabell

Beskriv hur en symboltabell i princip, oberoende av representation, hanterar:

a) Variabeldeklaration,

b) Variabelanvändning,

c) Påbörjande av nytt block,

d) Avslutande av aktuellt block.

Uppgift 3: Top-downparsning

När man ska anpassa en grammatik för recursive-descentparsning finns det två speciellt viktiga transformationer som utförs.

a) Namnge och definiera transformationerna. Definitionerna skall vara generella - inte bara illustrerade genom exempel.

b) Vilka problem är det man vill undvika genom att göra dessa transformationer? Förklara vad som händer i parsern om man inte gör dem, gärna med konkreta exempel.

Uppgift 4: Mellankodsgenerering

if (a + b == 0)
    while (x < y) {
        x = x + c;
        y = y - c;
    }
else
    a = - b;
a) Översätt ovanstående programavsnitt till ett abstrakt syntaxträd.

b) Översätt ovanstående programavsnitt till postfixnotation.

c) Översätt ovanstående programavsnitt till treadresskod.

Uppgift 5: Syntaxstyrd översättning

Ge en grammatikregel för en if-sats i ett högnivåspråk.

Skapa ett syntaxstyrt översättningsschema, med produktioner och semantiska regler, för översättning av if-satsen till treadresskod. Antag att översättningsschemat ska implementeras i bottom-up-parsningmiljö med en stack, som i Yacc och Bison. Utgå från din grammatikregel ovan, som dock kanske måste modifieras. Förklara införda attribut och eventuella funktioner och instruktioner som används. Ange alla dina antaganden.

Uppgift 7: Kodoptimering

a) Vad är en loop?

b) Vilka vanliga sätt finns för att optimera just loopar? Använd kodexempel.


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se) March 5, 2003