Εθνικό Μετσόβιο Πολυτεχνείο
Τμήμα Ηλεκτρολόγων Μηχ. και Μηχ. Υπολογιστών
Τομέας Πληροφορικής

 

Εξέταση στο μάθημα     :   Μεταγλωττιστές (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, -, -

Καλή Επιτυχία