a) En del av de uppräknade modulerna brukar kallas faser. Vad menas med en fas?
b) Ett annat uttryck som används i kompilatorsammanhang är pass. Vad är det för skillnad på en fas och ett pass?
c) I listan ovan är modulerna ordnade i bokstavsordning. Lista faserna i rätt ordning, till exempel som en rad av fyrkanter med pilar mellan.
d) Indata till den första fasen består av källprogrammet i textform (alltså en sekvens av tecken), medan utdata från den sista fasen utgörs av ett målprogram uttryckt i maskinspråk eller assemblerspråk. Beskriv alla fasernas indata och utdata, till exempel genom att skriva det på pilarna mellan fyrkanterna från uppgiften ovan.
e) En av modulerna ingår i kompilatorn, men är inte en fas. Vilken?
f) Några av de andra uppräknade sakerna ingår inte i kompilatorn, men används eller finns i anslutning till kompilatorn. Komplettera figuren ovan med de sakerna!
a) den lexikaliska analysen ("scannern")
b) den syntaktiska analysen ("parsern")
En övning i addition! Ange två tal och deras summa: 10 29 39 Rätt!
C-programmet nedan är tyvärr inte helt korrekt, och när vi försöker köra det får vi de angivna fel- och varningsmeddelandena. I vilka av kompilatorns faser, eller vid andra tidpunkter, upptäcks vart och ett av de olika felen och varningarna? Motivera dina svar!En övning i addition! Ange två tal och deras summa: 20 30 60 Nej, 20 + 30 blir 50!
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Program | Fel och varningar |
---|---|
#include <stdio.h> int main(void) { int a, b, summan; printf("En övning i addition!\n) printf("Ange två tal och deras summa: "); scanf("%d", &a); scanf("%d", b); scanf("%d", &gissning); if (gissning == summan) printf("Rätt!\n"); else print("Nej, %d + %d blir %d!\n", a, b, summan); return "0"; } |
warning: missing terminating " character error: expected ';' before 'printf' Segmentation fault (core dumped) error: 'gissning' undeclared warning: 'summan' is used uninitialized undefined reference to 'print' warning: returning 'char *' from a function with return type 'int' |
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Program | Fel och varningar |
---|---|
#include <stdio.h> int main(void) { int a; int 2a; printf("Hej!\n"); printg("Ange ett tal: "); scanf("%d", &a); printf("Talet = %d\n", a); return 0; } |
error: invalid suffix "a" on integer constant warning: implicit declaration of function 'printg' error: undefined reference to `printg' |
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Program | Fel och varningar |
---|---|
#include <stdio.h> int main(void) { int i = 17; float f = 3.14; char c = 'x'; char* s = "foo; s = f; printf("f = %f\n", i); c s; return; } |
missing terminating " character error: incompatible types in assignment warning: double format, different type arg (arg 2) error: syntax error before "s" warning: `return' with no value, in function returning non-void |
(Man kan behöva åtgärda en del av felen för att komma vidare och få de andra felen.)
Program | Fel och varningar |
---|---|
#inglude <stdio.h> int main(void) { int x, y, z, t; printf("Ange x: ); scanf("%d", &x); printf("Ange y: ") scanf("%d", y); t = x + y; u = x + y; printf("z = %d\n", z); f(8); } // main |
error: invalid preprocessing directive #inglude warning: missing terminating " character error: expected ';' before '}' token Segmentation fault (core dumped) warning: variable 't' set but not used error: 'u' undeclared warning: 'z' is used uninitialized warning: implicit declaration of function 'f' undefined reference to 'f' |