Kompilatorer och interpretatorer
fredag 12 januari 2024
Gäller som tentamen för:
DT501A Kompilatorer och interpretatorer för civilingenjörer, provkod A001
Hjälpmedel: | Ordbok för översättning. |
Poängkrav: |
Maximal poäng är 40.
För godkänt betyg krävs totalt minst 24 poäng. |
Resultat: | Meddelas senast 15 arbetsdagar efter tentamensdatum. |
Återlämning av tentor: | Elektroniskt via webbportalen Studenttjänster. |
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 <stdlib.h> #include <stdio.h> int a = 1, b = 2; void f(int c) { int* p; p = malloc(sizeof(int)); *p = c; if (c < 3) f(c + 1); else printf("Här!\n"); } void g(int d) { int a, e; int *p; a = 4; b = 5; e = 6; p = malloc(sizeof(int)); *p = d; f(1); } int main(void) { int a, f; a = 7; b = 8; f = 9; g(10); }
När programexekveringen kommer fram till raden med utskriften "Här!", antar vi att vi stoppar programmet och tittar på vilka olika variabler som finns i minnet.
I minnet kommer det då att finnas ett antal heltalsvariabler och andra lagringsutrymmen för heltal, som innehåller olika tal. Rita upp en skiss över dessa variabler och lagringsutrymmen, med innehåll, och förklara vad som är vad. Din förklaring bör bland annat innehålla termerna "statiska data", "stack", "heap", "aktiveringspost" och "parametrar".
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Programmet Meddelanden #include <stdlib.h> #include <stdio.h> int a = 1, b = 2; int f(int c) { int* p; *p = c; if (c < 3) f(c + 1); else printf("Här!\n"); } void g(int d) { int a, e; int *p; a = 4; b = 5; e = 6; p = malloc(sizeof(int); *p = d; f(); } int main(void) { int a, f; a = 7; b = 8; f = 9; h(10); } (1) Segmentation fault (core dumped) (2) control reaches end of non-void function (3) expected ")" before ";" token (4) too few arguments to function "f" (5) undefined reference to "h"
a = b; c = d; while (e < f + g + h * i + j) { k = m + n; } if (o < p) { q = r; } else { s = t; u = v; } w = 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
Observera: Två av typerna, inte alla tre!
Vi ska bygga en databas för att lagra data om gator och hus, och därför behöver vi ett särskilt inmatningsspråk. Med kommandona gata, hus och korsning ska man kunna mata in en beskrivning av vilka gator och hus som finns, och hur gatorna hänger ihop med varandra. Här är ett exempel på en inmatning:
gata Granvägen; hus Granvägen 6A; hus Granvägen 6B; gata Brickebergsvägen; hus Brickebergsvägen 19; gata Alstavägen; korsning Granvägen Alstavägen; gata Barkvägen; korsning Granvägen Barkvägen; gata Åstadalsvägen; gata Stenåsvägen; korsning Åstadalsvägen Stenåsvägen Brickebergsvägen; klart;
Här har vi matat in att det finns ett antal gator, var och en med ett namn som Granvägen eller Brickebergsvägen. Namn är alltid ett enda ord utan mellanslag, så namn som Elof Ljunggrens väg är inte tillåtna. Vi har också matat in att det finns ett antal hus, till exempel Granvägen 6A och Granvägen 6B. Dessutom anger vi hur gatorna sitter ihop med varandra i olika vägkorsningar, som att Granvägen och Barkvägen sitter ihop i en korsning. Notera att efter nyckelordet korsning kan det komma fler än två gator, exempelvis för att Åstadalsvägen, Stenåsvägen och Brickebergsvägen sitter ihop med varandra i en korsning. Hela inmatningen ska avslutas med ett klart-kommando, enligt ovan.
Inmatningen kan skrivas på fritt format. Exempelvis är nedanstående inmatning syntaktiskt ekvivalent med den i exemplet ovan.
gata Granvägen ; hus Granvägen 6A ; hus Granvägen 6B ; gata Brickebergsvägen ; hus Brickebergsvägen 19 ; gata Alstavägen ; korsning Granvägen Alstavägen ; gata Barkvägen ; korsning Granvägen Barkvägen ; gata Åstadalsvägen ; gata Stenåsvägen ; korsning Åstadalsvägen Stenåsvägen Brickebergsvägen ; klart ;
b) En del av terminalerna har inte fixa lexem, utan kan se olika ut. Skriv, för varje sådan terminal, ett reguljärt uttryck som beskriver hur den får se ut!
gata Vägen; gata Stigen; gata Gränden; korsning Vägen Stigen Gränden; klart;