|
Εθνικό Μετσόβιο Πολυτεχνείο |
Εξέταση στο μάθημα : Μεταγλωττιστές (8ο εξάμηνο)
Καθηγητής : Εμμ. Σκορδαλάκης
Ημερομηνία εξέτασης : 1 Οκτωβρίου 2001 (Επαναληπτική εξέταση)
Διάρκεια εξέτασης : 3 ώρες
Θέμα 1 [10%]
Να σχεδιαστεί ένα
ντετερμινιστικό πεπερασμένο αυτόματο σε μορφή γράφου μετάβασης, που να
αναγνωρίζει τις πραγματικές σταθερές μιας υποθετικής γλώσσας
προγραμματισμού. Κάθε τέτοια πραγματική
σταθερά αποτελείται κατά σειρά από: (1) πρόσημο, (2) ακέραιο μέρος,
(3) δεκαδικό μέρος και (4) εκθέτη, με τους ακόλουθους περιορισμούς:
·
Το πρόσημο,
το δεκαδικό μέρος και ο εκθέτης είναι προαιρετικά. Όμως δεν μπορεί να απουσιάζει συγχρόνως το δεκαδικό μέρος και ο
εκθέτης.
·
Το πρόσημο,
αν υπάρχει, μπορεί να είναι + ή –.
·
Το ακέραιο
μέρος αποτελείται από ένα ή περισσότερα ψηφία.
·
Το δεκαδικό
μέρος, αν υπάρχει, αποτελείται από μια τελεία που ακολουθείται από ένα ή
περισσότερα ψηφία.
·
Ο εκθέτης,
αν υπάρχει, αποτελείται από το γράμμα E που ακολουθείται από ένα προαιρετικό πρόσημο και
ένα ή περισσότερα ψηφία.
Για την περιγραφή
των χαρακτήρων εισόδου του αυτόματου, να χρησιμοποιήσετε τα σύμβολα D, E, +, – και . (τελεία). Το σύμβολο D παριστάνει οποιοδήποτε δεκαδικό ψηφίο.
Θέμα 2 [20%]
Δίνεται το παρακάτω πρόγραμμα Pascal. Ζητούνται:
(α) ο ενδιάμεσος κώδικας που θα παραχθεί, χωρίς βελτιστοποίηση, και
(β) τα εγγραφήματα δραστηριοποίησης για κάθε δομική μονάδα.
program main;
function daysOfFebruary (y : integer) : integer;
begin
if (y mod 4 = 0) and
(y mod 100 <> 0) or
(y mod 400 = 0)
and (y mod 4000 <> 0) then
daysOfFebruary :=
29
else
daysOfFebruary :=
28
end;
var year : integer;
begin
year := 2001;
writeInteger(daysOfFebruary(year))
end.
Θέμα 3 [20%]
Δίνεται το παρακάτω πρόγραμμα Pascal (αριστερά) και
ο αντίστοιχος ενδιάμεσος κώδικας (δεξιά).
Ζητούνται: (α) τα εγγραφήματα δραστηριοποίησης για κάθε δομική
μονάδα, και (β) ο τελικός κώδικας που θα παραχθεί για τις τετράδες: 2, 3,
5, 7, 9, 14, 18 και 19.
program main; var a, b : integer; procedure p (var a : integer; n : integer); var i : integer; begin a := a + n; i := 1; while i < n do begin p(a, i); i := i+1 end end; |
1: unit, p, -, - 2: +, a, n, $1 3: :=, $1, -, a 4: :=, 1, -, i 5: <, i, n, 7 6: jump, -, -, 13 7: par, a, R, - 8: par, i, V, - 9: call, -, -, p 10: +, i, 1, $2 11: :=, $2, -, i 12: jump, -, -, 5 13: endu, p, -, - |
begin a := 5; b := 7; p(b, a) end. |
14: unit, main, -, - 15: :=, 5, -, a 16: :=, 7, -, b 17: par, b, R, - 18: par, a, V, - 19: call, -, -, p 20: endu, main, -, - |
Καλή Επιτυχία