Kompilatorer och interpretatorer
för Dataingenjörsprogrammet
måndag 3 november 2008 kl 08:00 - 12:00
Gäller som tentamen för:
DT3004 Datateknik C, Kompilatorer och interpretatorer, provkod 0100
TDK104 Kompilatorer och interpretatorer, provkod 0100
Hjälpmedel: | Inga hjälpmedel. |
Poängkrav: |
Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng. |
Resultat: | Meddelas på kursens hemsida eller via e-post senast måndag 24 november 2008. |
Visning och frågestund: |
Tisdag 25 november 2008 kl 15:00-15:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på institutionen. Man kan också få sin rättade tenta hemskickad. |
Examinator och jourhavande: | Thomas Padron-McCarthy, telefon 070-73 47 013. |
Här är några exempel på SQL-kommandon som den här databashanteraren förstår:
Databashanteraren implementerar alltså en ganska liten delmängd av det vanliga databasspråket SQL. Mer om SQL-dialekten:create table Blaha (foo integer unique, fum string primary key, blaj string unique); drop table Blaha; create table Apa (nummer integer, namn string, svampkod integer); insert into Apa values (1, 'Hej', 17);
create table Apa (nummer integer default 10 not null, namn char(10), svampkod integer references Svamp(id)); insert into Apa (nummer, namn) values (17, 'Hej'); select * from Apa;
a) (2p) Ange vilka terminaler, dvs typer av tokens, som behövs för att man ska kunna skriva en grammatik för SQL-dialekten.
b) (5p) Skriv grammatiken. Använd terminalerna från a-uppgiften. Ange vad som är startsymbol. Startsymbolen ska beskriva ett SQL-kommando, enligt ovan.
c) (2p) Om grammatiken från b-uppgiften inte lämpar sig för implementation i form av en prediktiv recursive-descent-parser, så transformera den så den passar. (Om den redan är lämplig, behöver du inte göra om den, utan du får 2 poäng på den här deluppgiften i alla fall.)
d) (6p) Skriv den prediktiva recursive-descent-parsern i ett språk som åtminstone liknar C, Java eller Pascal. 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 redan finns en funktion som heter scan, och att den returnerar typen på nästa token.
När man försöker kompilera och köra programmet, får man följande fyra felmeddelanden:1 #include <math.h> 2 3 int main(void) { 4 char* s = "hej!; 5 int i = 18; 6 double = 7.3; 7 double e = arcsin(1.13); 8 e = s; 9 return 0; 10 }
En kompilator indelas i flera faser. I vilken fas (eller någonannanstans) har vart och ett av de fyra felen upptäckts?faser.c:4: error: missing terminating " character faser.c:6: error: expected identifier or '(' before '=' token faser.c:8: error: incompatible types in assignment faser.c:7: undefined reference to `arcsin'
Översätt ovanstående programavsnitt till var och en av följande tre typer av mellankod:i = 1; j = 17; while (i < j) { m = (i + j - 1) / 2; i = i + j; j = i + j; if (i > x) x = j; }
a) ett abstrakt syntaxträd (genom att rita upp trädet!)
b) postfixkod för en stackmaskin
c) treadresskod, i form av en flödesgraf ("flow graph") med treadresskoden indelad i basic blocks
Tala också om i vilken av kompilatorns faser (eller någonannanstans) som man använder sig av dessa saker.