Kompilatorer och interpretatorer
för Dataingenjörsprogrammet
måndag 18 oktober 2004 kl 8:00 - 13:00 i L0001
Hjälpmedel: | Inga hjälpmedel. |
Poängkrav: |
Maximal poäng är 54.
För betyget 3 krävs 27 poäng. För betyget 4 krävs 36 poäng. För betyget 5 krävs 45 poäng. |
Resultat: | Meddelas på kursens hemsida senast måndag 8 november 2004. |
Visning och frågestund: |
Meddelas senare.
Därefter kan tentorna hämtas på expeditionen. |
Examinator och jourhavande: | Thomas Padron-McCarthy, telefon 070-7347013. |
Skriv en grammatik för kommandospråket. Grammatiken ska hantera ett enda kommando, med ett eller flera mål. Det är inget krav att grammatiken ska lämpa sig för någon viss typ av parsning, men den ska vara entydig.
Exempel på kommandon som grammatiken ska klara:
Om den grammatik du gjorde i uppgift 1 inte lämpar sig för implementation av en prediktiv recursive-descent-parser, så gör först om den till en grammatik som beskriver samma språk, men som enkelt kan implementeras i en prediktiv recursive-descent-parser. Beskriv vad du gör, och varför.
Om du svarar ja: Ange det reguljära uttrycket.
Om nej: Förklara varför det inte går.
Översätt ovanstående programavsnitt tilli = 1; j = 0; while (i > j) { if (i < 10) i = i + 1; else j = 10 - i - j; }
a) ett abstrakt syntaxträd (rita upp trädet!)
b) postfixkod för en stackmaskin
c) treadresskod
När du skriver regeln kan du anta att icke-terminalerna Statement och Expression finns, och terminalerna switch, case, break, default, (, ), {, }, : och ;.switch (i - j - k) { case 1: i = i + 2; break; case 2: i = i + 3; break; case 3: i = 19; break; case k + 7: i = 19; break; default: i = 19; break; }
Du kan använda dig av den här regeln för en case-gren:
Branch -> case Expression : Statement break ;
Använd ett språk som åtminstone liknar C, Java eller Pascal, och skriv funktionen execute_switch, som exekverar switch-satsen. Den ska ta en pekare till en trädnod som argument.
Det finns redan en funktion, execute, som tar en pekare till en trädnod som argument. Den kan användas för att beräkna uttryck och utföra satser (utom, tyvärr, just switch-satsen).
Trädnoderna är av typen TreeNode. Du kan anta att trädnoderna har ett typfält som heter type, och som bland annat kan ha värdena SWITCH, CASE och DEFAULT. Noderna har pekare till de underliggande subträden i en array som heter args. Om pekaren p pekar på en trädnod, kan man nå det vänstra subträdet under den noden med uttrycket p->args[0].