Kompilatorer och interpretatorer
för Dataingenjörsprogrammet m fl
måndag 24 oktober 2016
Gäller som tentamen för:
DT3030 Datateknik C, Kompilatorer och interpretatorer, provkod 0100
Hjälpmedel: | Inga hjälpmedel. |
Poängkrav: |
Maximal poäng är 41.
För godkänt betyg krävs totalt minst 24 poäng, varav minst 8 poäng på uppgift 1. |
Resultat: | Meddelas på kursens hemsida eller via e-post senast måndag 14 november 2016. |
Återlämning av tentor: | Elektroniskt via Studentforum. |
Examinator och jourhavande: | Thomas Padron-McCarthy, telefon 070 - 73 47 013. |
A är en icke-terminal, men x och y står för godtyckliga konstruktioner som består av terminaler och icke-terminaler.A -> A x | y
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
A är en icke-terminal, men x, y och z står för godtyckliga konstruktioner som består av terminaler och icke-terminaler.A -> x y | x z
Skriv om till dessa tre produktioner:
A -> x R R -> y | z
#include <stdi.h> // fatal error: stdi.h: No such file or directory int main(void) { double d1 = 1.0; // warning: unused variable 'd1' int d1 = 2; // error: conflicting types for 'd1' double 2; // error: expected identifier or '(' before numeric constant int i = 17; printf(Hej!); // error: 'Hej' undeclared // error: expected ')' before '!' token printg("%d", i); // undefined reference to `printg' printf("%s", i); // Segmentation fault (core dumped) return 0; }
#include <stdlib.h> #include <stdio.h> int a = 1, b = 2; int f(int x, int y) { int c; int *d; a = x; c = 3; d = malloc(sizeof(int)); *d = b; if (x < 2) { return x * f(x + 1, y + 2); } else { printf("Nu!\n"); return 1; } } int main(void) { int a; int *b; a = 2; b = malloc(sizeof(int)); *b = 3; a = f(0, 4); return 0; }
a = 1; b = c * 2 + 3 + d; if (a < b) { while (a + 4 < b * 5 + c) { a = a + 6; } } else { a = 7; b = 8; }Översätt ovanstående programavsnitt till två av följande tre typer av mellankod.
a) ett syntaxträd, även kallat abstrakt syntaxträd (genom att rita upp trädet!)
b) postfixkod för en stackmaskin
c) treadresskod
Observera: Det finns tre deluppgifter i uppgiften ovan. Välj ut och besvara (högst) två av dessa. (Skulle du svara på alla tre, räknas den med högst poäng bort.) |
En beställning börjar med nyckelordet start och avslutas med nyckelordet klart. Efter nyckelordet start kommer nyckelordet namn följt av en textsträng som anger namnet på kunden. Därefter kan det, men måste inte, komma nyckelordet telefon följt av en textsträng som anger telefonnumret till kunden. Efter detta en eller flera fikabrödsbeställningar, där var och en består av ett tal (som kan innehålla decimaler) och ett av orden kanelbulle, wienerbröd och chokladboll. Blanktecken, som mellanslag och radslut, ska ignoreras, förutom inuti nyckelord, tal och textsträngar.
Här följer två exempel på beställningar:
start namn "Anna A. Andersson" telefon "070-73 47 013" 1 kanelbulle 2 wienerbröd 1 kanelbulle 1 chokladboll 3 chokladboll klart |
start namn "Anna A. Andersson" 1 kanelbulle 2 wienerbröd klart |
start namn "Olle" 1 kanelbulle 2 wienerbröd klart |