Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών — Ιούνιος 2023 — Παραλλαγή Α¶
Μεταγραφή από τις φωτογραφίες IMG_6178.jpg και IMG_6179.jpg. Το IMG_6178.png επιβεβαιώθηκε ως αντίγραφο του IMG_6178.jpg. Το Themata_2023.pdf είναι ανακατασκευή από μη επαληθευμένο κείμενο και δεν αντιγράφεται.
IMG_6178.jpg¶
ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΑΙ ΜΕΤΑΦΡΑΣΤΩΝ Εξέταση Περιόδου Ιουνίου 2023
ΘΕΜΑ 1 – Λεξική και Συντακτική Ανάλυση (40%) Δίνεται η παρακάτω BNF γραμματική, τμήμα της περιγραφής του συντακτικού μιας γλώσσας προγραμματισμού. Τα τερματικά σύμβολα της γραμματικής είναι τα: int float id , ; ένας χαρακτήρας κενού
::= int<κενό>id | float<κενό>id
::= ,<κενό>id | ;
<κενό> ::= ένας χαρακτήρας κενού (μπορείτε να τον συμβολίζετε με _ )
(a) Να περιγράψετε τις κατασκευές που παράγονται από τη γραμματική. Τι θα μπορούσε να περιγράψει στη γλώσσα C η παραπάνω γραμματική, ως τμήμα της συνολικής γραμματικής της γλώσσας; Παρουσιάστε μερικά παραδείγματα νόμιμων εκφράσεων της γλώσσας.
(b) Είναι LL(1) η γραμματική; Αιτιολογήστε την απάντησή σας.
(c) Είναι το int m, p; μέλος της γλώσσας; Απαντήστε παρουσιάζοντας τη Στοίβα Ολίσθησης – Ελάττωσης Bottom-Up συντακτικής ανάλυσης για το string.
(d) Τι τύπου είναι η γραμματική στην ιεραρχία Chomsky; Αιτιολογήστε την απάντησή σας.
(e) Μπορείτε να φτιάξετε μια κανονική έκφραση αντίστοιχη της γραμματικής και γιατί; Αν ναι, παρουσιάστε την.
(f) Επιπλέον, υπάρχει ντετερμινιστικό πεπερασμένο αυτόματο αντίστοιχο της κανονικής έκφρασης; Αν ναι, παρουσιάστε διάγραμμα καταστάσεων – μεταβάσεων του αυτόματου.
Η αρχή του ΘΕΜΑΤΟΣ 2 φαίνεται και σε αυτή τη φωτογραφία (γραμμές 1–6 του κώδικα), αλλά ολόκληρο το Θέμα 2 μεταγράφεται από το IMG_6179.jpg.
IMG_6179.jpg¶
ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΑΙ ΜΕΤΑΦΡΑΣΤΩΝ Εξέταση Περιόδου Ιουνίου 2023
ΘΕΜΑ 2 – Μεταβλητές και Διαχείριση Μνήμης (20%) Δίνεται το παρακάτω τμήμα προγράμματος σε γλώσσα C:
1 int main()
2 {
3 int data[6] = {10, 20, 30, 40, 50, 60};
4 int *p;
5 p = &data[2];
6 *(p-1) = (*(p-2))--;
7 *p += 1;
8 *++p = 44;
9 *p++ = 33;
10 p++;
11 *p = (*p > 50)? *p-1: *p+1;
12 for (int i=0; i<6; i++) printf("%d\n", data[i]);
13 return 0;
14 }
Σημείωση: η φωτογραφία περιέχει χειρόγραφες απαντήσεις φοιτητή.
ΘΕΜΑ 3 – Εμβέλεια και Μεταβίβαση Παραμέτρων (20%) Δίνεται το παρακάτω πρόγραμμα σε μια γλώσσα τύπου Pascal που χρησιμοποιεί το στατικό κανόνα εμβέλειας:
program MAIN;
var n: integer;
var A: array [1..5] of integer;
procedure F(k, b: integer);
begin
writeln(k);
n:= n + 1;
writeln(k);
k:= k + 4;
writeln(n);
b:= b + 5;
end;
BEGIN
A[1]:= 10; A[2]:= 20; A[3]:= 30; A[4]:= 40; A[5]:= 50;
n:= 1;
F(n, a[n+2]);
writeln(n);
writeln(A[1], ' ', A[2], ' ', A[3], ' ', A[4], ' ', A[5]);
END.
[Λείπει από τη φωτογραφία: τα ερωτήματα του ΘΕΜΑΤΟΣ 3]
[Σχήμα: Πλαίσιο που γράφει: X1 X2 X3 X4 X5 X6 X7 X8 X9 Μορφή εξόδου του προγράμματος για τις πέντε εντολές writeln.]
[Λείπει από τη φωτογραφία: Θέματα 4 και άνω]
Λύσεις (⚪ AI, μη επαληθευμένο)
Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: migrated from previous_exams.md (Antigravity, 2026-10)
Προσοχή
Θέμα 3: τα ερωτήματα του θέματος δεν φαίνονται στις φωτογραφίες. Η λύση εξετάζει και κλήση με αναφορά (var k, b), που δεν υπάρχει στην κεφαλίδα F(k, b: integer) του κώδικα.
Θέμα 2: η λύση δίνει μόνο τις τελικές τιμές του πίνακα· η ανάλυση γραμμή προς γραμμή που ζητά η εκφώνηση δεν μεταφέρθηκε.
Λύσεις — Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών — Ιούνιος 2023 — Παραλλαγή Α¶
Λύσεις που μεταφέρθηκαν από το παλιό συγκεντρωτικό αρχείο. Δεν έχουν επαληθευτεί· οι ασυμφωνίες με την εκφώνηση σημειώνονται στα warnings του αρχείου.
(α) Περιγραφή Κατασκευών:
- Περιγράφει δηλώσεις μεταβλητών τύπου int ή float στη γλώσσα C με λίστα αναγνωριστικών χωρισμένων με κόμμα και τερματισμό με ερωτηματικό ;.
- Παραδείγματα νόμιμων εκφράσεων:
- int _ x ;
- float _ temperature ;
- int _ a , _ b , _ c ;
(β) Είναι LL(1) η γραμματική; - ΝΑΙ, η γραμματική είναι LL(1). - Τα \(\text{FIRST}\) σύνολα των εναλλακτικών για το \(\langle S \rangle\) είναι \(\{\text{int}\}\) και \(\{\text{float}\}\), τα οποία είναι ξένα. - Τα \(\text{FIRST}\) σύνολα για το \(\langle A \rangle\) είναι \(\{,\}\) και \(\{;\}\), τα οποία επίσης είναι ξένα. - Δεν υπάρχει αριστερή αναδρομή, ούτε κοινά προθέματα (είναι ήδη αριστερά παραγοντοποιημένη).
(γ) Έλεγχος του int m, p; με Στοίβα Ολίσθησης - Ελάττωσης (Bottom-Up):
- Συμβολοσειρά εισόδου: int _ m , _ p ; $
1. Shift int, Shift _, Shift m (id).
2. Shift ,, Shift _, Shift p (id).
3. Shift ;.
4. Reduce ; \(\to A\).
5. Reduce , _ p A \(\to A\).
6. Reduce int _ m A \(\to S\).
7. Accept! Το string παράγεται νόμιμα.
(δ) Τύπος στην Ιεραρχία Chomsky: - Τύπου 3 (Κανονική Γραμματική - Regular Grammar), καθώς είναι δεξιά γραμμική (κάθε παραγωγή έχει τη μορφή \(A \to w B\) ή \(A \to w\), όπου \(w\) τερματικά και \(B\) μη-τερματικό στο τέλος).
(ε) Κανονική Έκφραση: $\((\text{int} \mid \text{float}) \_ \text{id} (, \_ \text{id})^* ;\)$
(στ) DFA (Ντετερμινιστικό Πεπερασμένο Αυτόματο): - \(q_0 \xrightarrow{\text{int, float}} q_1 \xrightarrow{\_} q_2 \xrightarrow{\text{id}} q_3\) - Από \(q_3 \xrightarrow{;} q_{\text{final}}\) (αποδεκτή) - Από \(q_3 \xrightarrow{,} q_4 \xrightarrow{\_} q_5 \xrightarrow{\text{id}} q_3\) (βρόχος πολλαπλών μεταβλητών).
Τελικές τιμές πίνακα data:
- data[0] = 9
- data[1] = 10
- data[2] = 31
- data[3] = 33
- data[4] = 50
- data[5] = 59
- Στην κλήση
F(n, A[n+2]), με \(n=1\), το όρισμα είναιA[1+2] = A[3] = 30. - Εφόσον οι παράμετροι \(k, b\) είναι call-by-value (δεν υπάρχει
varστην κεφαλίδα): writeln(k)\(\implies\) τυπώνει 1n := n + 1\(\implies n = 2\) (η \(n\) είναι καθολική)writeln(k)\(\implies\) τυπώνει 1 (η τοπική \(k\) δεν επηρεάζεται από την \(n\))k := k + 4\(\implies k = 5\)writeln(n)\(\implies\) τυπώνει 2b := b + 5\(\implies b = 35\) (τοπική, δεν αλλάζει το \(A[3]\))- Μετά την έξοδο από την \(F\):
writeln(n)\(\implies\) τυπώνει 2writeln(A[1], ' ', A[2], ' ', A[3], ' ', A[4], ' ', A[5])\(\implies\) τυπώνει 10 20 30 40 50- Αν οι παράμετροι ήταν Call by Reference (
var k, b): writeln(k)\(\implies\) 1- \(n := n + 1 \implies n = 2\) (και άρα \(k = 2\), αφού \(k \equiv n\))
writeln(k)\(\implies\) 2- \(k := k + 4 \implies k = 6\) (και \(n = 6\))
writeln(n)\(\implies\) 6- \(b := b + 5 \implies A[3] = 35\)
writeln(n)\(\implies\) 6- Τελικός πίνακας: 10 20 35 40 50