Kompilatorer och interpretatorer
för Dataingenjörsprogrammet m fl
tisdag 16 augusti 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 43.
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 tisdag 6 september 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
#binclude <stdio.h> // error: invalid preprocessing directive int main(void) { int a; ink b; // error: unknown type name 'ink' float a; // error: conflicting types for 'a' printf("Hej!\n); // error: missing terminating " character print("Tal: "); // error: undefined reference to `print' scanf("%d", &a); printf("Talet = %d\n", a); return "OK"; // warning: return makes integer from pointer }
a = 1; b = 2; while (a < 3 + b + 4) { a = 5; b = 6; if (a > 7) { b = 8; } else { b = 9; } } a = 10;Ö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.) |
#include <stdlib.h> #include <stdio.h> int a = 1; void g(void) { int d; int *e; d = 7; e = malloc(sizeof(int)); *e = 8; } int f(int x, int y) { int a; int *c; a = 5; x = x + y; c = malloc(sizeof(int)); *c = 6; g(); printf("Här!\n"); return a; } int main(void) { int a; int *b; a = 2; b = malloc(sizeof(int)); *b = 3; a = f(a, 4); return 0; }
De svarta klisterlapparna är överklistrade skott från tidigare serier.
För att förenkla poängräkningen vill vi skapa ett program, där man kan mata in poängen med ett särskilt kommandospråk. Här är ett exempel på en fullständig dialog med programmet, där användarens inmatning (med det särskilda kommandospråket) är understruken, och programmets utmatning är raderna som börjar med stjärnor.
Inmatningen består av rader, där en rad kan börja med "skytt", och ange en skytt som deltar i tävlingen, eller med "serie", och ange en serie som en skytt har skjutit, eller "klar", och ange att inmatningen är slut.skytt "Olle" *** Olle är skytt nummer 1 skytt "Anna Strid" *** Anna Strid är skytt nummer 2 skytt "Anna Stål" *** Anna Stål är skytt nummer 3 serie 1 10 10 10 9 9 *** Olle sköt en serie på 48 poäng serie 2 10 10 10 10 8 *** Anna Strid sköt en serie på 48 poäng serie 3 10 10 7 7 7 *** Anna Stål sköt en serie på 41 poäng serie 1 10 10 9 9 8 *** Olle sköt en serie på 46 poäng serie 2 10 10 10 10 10 *** Anna Strid sköt en serie på 50 poäng serie 3 10 10 9 9 9 *** Anna Stål sköt en serie på 47 poäng klar *** Resultat: *** 1. Anna Strid (skytt nummer 2): 98 poäng *** 2. Olle (skytt nummer 1): 94 poäng *** 3. Anna Stål (skytt nummer 3): 88 poäng
skytt "Ragnar" serie 1 10 10 10 10 10 klart