Det här är hemtentan som går fredag 29 oktober 2021 i kursen
DT135G
Kompilatorer och interpretatorer,
provkod A001.
Ansvarig lärare är
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
telefon 070-73 47 013.
Tid: 08:15 - 13:15
Instruktioner
-
Den här hemtentan ersätter den planerade salstentan.
-
Tentatiden är utökad med en extra timme
för att täcka in problem med e-post, inscanning eller fotografering av diagram, och liknande.
-
Uppgifterna ska lösas enskilt, dvs inga grupper av två eller flera studenter.
-
Du får använda dator, böcker och vilka andra hjälpmedel som helst,
men du får inte samarbeta eller fråga någon (utom mig).
Exempelvis är det tillåtet att söka och läsa på webbplatser som Stack Overflow, men inte att ställa egna frågor.
Du kan alltså provköra kommandon och program, om du vill.
Självklart är det förbjudet att använda sig av webbplatser och tjänster
där man, gratis eller mot betalning, kan få andra att lösa ens uppgifter.
-
Diskutera inte uppgifterna eller dela med dig av svar förrän tidigast dagen efter tentan.
-
Lös de angivna uppgifterna och samla svaren på lämpligt sätt,
till exempel i en PDF.
Skicka sen in lösningarna till mig i
Blackboard.
(Gå till kursens sida i Blackboard,
gå in i mappen Hemtentor,
och välj den rätta tentan.
Där kan man sedan välja att skicka in sin lösning.
Då blir bedömningen anonym.)
-
Om det skulle bli problem med Blackboard,
kan man i nödfall skicka in svaren
antingen som ett kursmeddelande i Blackboard
eller via vanlig e-post
(thomas.padron-mccarthy@oru.se),
senast vid tentatidens slut.
Då blir bedömningen inte anonym.
-
I Blackboard ser du att du skickat in din lösning.
Om du i stället skickade in med e-post,
och inte senast en timme efter tentatidens slut fått
ett svar från mig med en bekräftelse
på att du skickat in svaren,
bör du kontakta mig, enklast genom att ringa eller SMS:a mig
(ifall det är e-posten som inte fungerar).
Tänk på att en del mailtjänster
(särskilt Microsoft-tjänster som Hotmail.com, Outlook.com och Live.com)
ibland kastar bort brev med bilagor, utan att meddela det.
-
Skriv gärna svaren i ett ordbehandlingsprogram.
Rita gärna eventuella diagram i ett ritprogram.
Det är inte förbjudet att skriva och rita för hand,
men då måste text och bilder scannas in eller fotograferas.
Det finnas scanner-appar till Android och iPhone,
till exempel Adobe Scan,
som ger bättre resultat än att bara ta vanliga kort med kameran.
-
Om du behöver fråga något, så kontakta gärna mig.
Ring eller skicka SMS,
för jag kanske inte kommer att sitta vid datorn hela tiden.
-
Oklara och tvetydiga formuleringar kommer att misstolkas.
Lösningar som inte går att läsa eller förstå kan naturligtvis inte ge några poäng.
-
Antaganden utöver de som står i uppgifterna måste anges. Gjorda antaganden får inte förändra den givna uppgiften.
-
Skriv gärna förklaringar om hur du tänkt. Även ett svar som är fel kan ge poäng, om det finns med en förklaring som visar att huvudtankarna var rätt.
-
Maximal poäng är 35.
För godkänt betyg krävs minst 20 poäng.
-
Resultat meddelas senast 15 arbetsdagar efter tentamensdatum.
Eftersom svaren skickas in elektroniskt scannas tentorna inte för retur.
Information från institutionen angående fusk
Instruktioner inför digital hemtentamen/ examination
Jag vill undvika fusk - hur gör jag? / All form av fusk anmäls
Du ska följa instruktionerna för uppgiften.
Om du är osäker, fråga ansvarig lärare om något i instruktionerna är oklart.
Du får inte samarbeta.
Det här är en individuell examinationsuppgift. Du ska inte prata med någon, ställa frågor till eller ta hjälp av andra studenter eller kurskamrater. Att hjälpa andra under en individuell examination är också fusk.
Lägg undan mobilen. Stäng av sociala medier.
Du får inte använda hjälpmedel.
Det vill säga att du får inte använda dig av något annat än det som står angivet i instruktionerna.
Du får inte använda andra formuleringar än dina egna.
Dina svar ska vara självständigt formulerade och redovisa dina kunskaper.
Det betyder att inga citat eller referat ska förekomma i dina svar om det inte står i instruktionerna att du får använda citat eller referat.
Dina svar kontrolleras via Urkund.
All misstanke om fusk anmäls till universitetets rektor och kan leda till en prövning i universitets disciplinnämnd.
Konsekvenser av fusk
Om du fuskar kan detta leda till en avstängning som kan få följder både för dina studier och privat:
- Uteblivet studiemedel som t.ex. som kan påverka din möjlighet att behålla din bostad.
- Ingen åtkomst till digitala plattformar.
- Du kan behöva meddela dina kursare om att du är fälld för fusk, om du t.ex. ingår i ett grupparbete på en pågående kurs men blir avstängd.
- Tillfällen för examination går förlorade vilket kan innebära att du inte kommer vidare i dina studier nästa läsperiod/termin och din studiegång blir därmed påverkad.
- Beslutet är en offentlig handling som begärs regelbundet ut av en nyhetsbyrå. Och kan även begäras ut av framtida arbetsgivare eller andra.
- Om du fuskar dig igenom din utbildning har du inte den kunskap som arbetsmarknaden förväntar av dig.
OBS: Tänk efter en gång till innan du påbörjar och genomför din tentamen!
|
Formelsamling
1. Eliminering av vänsterrekursion
En vänsterrekursiv grammatik kan skrivas om så att den inte är vänsterrekursiv.
Antag att en regel (eller, korrektare uttryckt, två produktioner)
i grammatiken ser ut så här:
A -> A x | y
A är en icke-terminal,
men x och y står för godtyckliga konstruktioner
som består av terminaler och icke-terminaler.
Regeln ersätts av följande två regler (eller, korrektare uttryckt, tre produktioner),
som beskriver samma språk men som inte är vänsterrekursiva:
A -> y R
R -> x R | empty
2. Vänsterfaktorisering
Antag att grammatiken innehåller denna regel (två produktioner):
A -> x y | x z
A är en icke-terminal,
men x, y och z står för godtyckliga konstruktioner
som består av terminaler och icke-terminaler.
Skriv om till dessa tre produktioner:
A -> x R
R -> y | z
Uppgift 1 (5 p)
Vi skriver ett C-program som låter användaren mata in tal,
och sen skriver ut talens genomsnitt.
Körexempel, med användarens inmatning understruken:
Ange antalet tal: 5
Ange tal nummer 1: 10
Ange tal nummer 2: 20
Ange tal nummer 3: 10
Ange tal nummer 4: -4
Ange tal nummer 5: 100
Genomsnitt: 27.200000
|
Programmet, som visas nedan,
är tyvärr inte helt korrekt,
och när vi försöker bygga och köra det får vi de angivna fel- och varningsmeddelandena.
I vilka av kompilatorns faser, eller vid andra tidpunkter,
upptäcks vart och ett av de olika felen och varningarna?
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Programmet | Meddelanden |
#include <stdio.h>
int start(void) {
int antal;
printf("Ange antalet tal: ");
scanf("%d", &antalet);
Int summa = 0;
for (int i = 0; i < antal; ++i) {
int talet = "0"
printf("Ange tal nummer %d: ",
i + 1);
scanf("%d", talet);
summa += 3talet;
}
printf("Genomsnitt: %f\n",
1.0 * summa div antal);
}
|
(1) undefined reference to "main"
(2) error: "antalet" undeclared
(3) error: unknown type name "Int"
(4) warning: "antal" is used uninitialized
(5) warning: initialization of "int" from "char *"
(6) error: expected "," or ";" before "printf"
(7) Segmentation fault (core dumped)
(8) error: invalid suffix "talet" on integer constant
(9) error: expected ")" before "div"
(10) warning: control reaches end of non-void function
|
Uppgift 2 (5 p)
Det här är ett programavsnitt i ett C-liknande språk:
if (x * y == z * t * t) {
x = y;
while (z < t) {
x = y * z * t;
y = z * t;
}
x = y;
}
else {
z = t;
}
t = x;
|
Översätt ovanstående programavsnitt till
två av följande tre typer av mellankod.
(Skulle du svara på alla tre, räknas den med högst poäng bort.)
a) ett abstrakt syntaxträd (genom att rita upp trädet!)
b) postfixkod för en stackmaskin
c) treadresskod
Scenario till de övriga uppgifterna
Här är ett skolfoto från år 1900, hämtat från Wikipedia:
Vi ska skapa ett inmatningsspråk för att ange vilka klasser som finns på en skola,
och vilka elever som går i dem.
I språket kan man ge de här kommandona:
- Kommandot klass,
som används för att ange att det finns en klass.
Kommandot består av ordet klass, följt av namnet på klassen inom citationstecken, och avslutas med ett semikolon.
Exempel: klass "1a";
- Kommandot elev, som anger att det finns elever,
och vilken klass de går i.
Kommandot består av ordet elev,
följt av ett eller flera elevnamn inom citationstecken, med kommatecken mellan namnen,
följt av i vilken klass dessa elever går, och avslutas med ett semikolon.
Exempel: elev "Anna Alm", "Bodil Berg" i klass "1a";
- En alternativ form av elev-kommandot anger att det finns elever,
men som inte blivit placerade i någon klass.
Kommandot består av ordet elev,
följt av ett eller flera elevnamn inom citationstecken, med kommatecken mellan namnen, och avslutas med ett semikolon.
Exempel: elev "Cecilia Citron", "Donald D. Duck";
-
Kommandot klart, som avslutar inmatningen.
Exempel: klart;
En komplett inmatning i språket består av noll eller flera
klass- och elev-kommandon,
följt av ett klart-kommando.
Kommandona kan skriva i godtycklig ordning,
utom klart-kommandot som måste komma sist i inmatningen.
Kommandon kan skrivas på fritt format,
dvs att man kan stoppa in godtyckliga mellanslag och radbrytningar,
utom inuti namnen som avgränsas med citationstecken.
Exempel på en komplett inmatning:
klass "1a";
elev "Anna Andersson" i klass "1a";
klass "2a";
elev "Bengt Bengtsson" i klass "2a";
elev "Conny C Cornström III",
"Hosianna Davidsson"
i klass "1a";
klass "2b";
klass "2 reserv";
elev "Eru Ilúvatar", "Filip Filipsson";
klart;
|
Uppgift 3 (4 p)
a)
Vilka terminaler
behövs för att man ska kunna skriva en grammatik för språket?
b)
Det kan hända att en eller flera av terminalerna
inte har fixa lexem, utan kan se ut på olika sätt.
Skriv i så fall reguljära uttryck som beskriver hur de får se ut.
Uppgift 4 (4 p)
Skriv en scanner som kan dela upp inmatningen i tokens.
Du får själv välja om du ska använda Flex eller skriva den för hand
i C, C++ eller ett liknande språk.
Scannern ska bestå av en funktion som returnerar en token-kod.
Du kan anta att token-koderna finns definierade i form av makron eller enum-konstanter,
ungefär som Bison gör när man har en Bison-grammatik med
%token-deklarationer.
Uppgift 5 (5 p)
Skriv en grammatik för språket.
Startsymbolen ska vara inmatning,
som representerar en komplett inmatning enligt scenariot ovan.
Uppgift 6 (4 p)
Ett parse-träd (ibland kallat "konkret syntaxträd") innehåller noder för alla icke-terminaler.
Rita upp parse-trädet för den här inmatningen,
enligt din grammatik i uppgiften ovan:
elev "Anna Alm" i klass "3b";
elev "Bob Berg", "Conny C Cornström III", "Napoleon";
klart;
|
Uppgift 7 (8 p)
Skriv en prediktiv recursive-descent-parser för språket.
i ett språk som åtminstone liknar C, C++, C# eller Java.
Du behöver inte skriva exakt korrekt programkod,
men det ska framgå vilka procedurer som finns,
hur de anropar varandra, och vilka jämförelser med tokentyper som görs.
Du kan anta att det finns en funktion som heter scan,
som returnerar typen på nästa token,
och en funktion som heter error,
som man kan anropa när något gått fel
och som skriver ut ett felmeddelande och avslutar programmet.
Du kan anta att token-koderna finns definierade i form av makron eller enum-konstanter.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
28 oktober 2021