Kompilatorer och interpretatorer
för Dataingenjörsprogrammet m fl
måndag 3 november 2014
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 42.
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 24 november 2014. |
| Återlämning av tentor: | Efter att resultatet meddelats kan tentorna hämtas på universitetets centrala tentamensutlämning. |
| 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
| Program | Fel och varningar |
|---|---|
#include <math.h>
int main(void) {
int ena = 1, andra = 2 * ena, tredje = 3andra;
double x = sqrt(ena) sqrt(andra);
double y, z;
x = x * y;
printf("Hej, världen! x = %f\n", x);
return "Ok!";
}
|
invalid suffix "andra" on integer constant expected ',' or ';' before 'sqrt' unused variable 'z' 'y' is used uninitialized in this function missing declaration of function 'printf' return makes integer from pointer without a cast |
if (a < b)
c = a;
else
c = b;
while (a < b) {
a = a * 2 + 3 * d;
b = b - d - 1;
}
Översätt ovanstående programavsnitt till var och en 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
#include <stdlib.h>
#include <stdio.h>
int a = 1, b = 2;
int f(int a) {
int b = 3;
printf("Här!\n");
return a;
}
int g(int c) {
int b = 4;
int *d = malloc(sizeof(int));
*d = c;
if (c > 5)
b = b * g(c - 1);
else
b = f(c);
return b;
}
int main(void) {
int b = 6;
b = g(7);
printf("b = %d\n", b);
return 0;
}
struct Punkt {
int nummer;
float x, y;
};
I de förenklade struct-deklarationer som vårt program ska klara
finns bara de två datatyperna int och float.
Här är ett annat exempel på en struct-deklaration, som visar att C-kod kan skrivas på fritt format, dvs att man kan stoppa in extra mellanslag och radbrytningstecken:
struct Banan { float pris;
float vikt;
int
banannummer;
float pos1, pos2, pos3, pos3b; };
b) Ange reguljära uttryck för de terminaler som inte har ett fast utseende.
struct Vara {
int nummer;
float pris, vikt;
};