View on GitHub

dituoi_agp

Αρχές Γλωσσών Προγραμματισμού

Ασκήσεις

Άσκηση 1

Για την ακόλουθη γραμμή κώδικα ενός προγράμματος να σχεδιάσετε την είσοδο και την έξοδο κάθε φάσης μεταγλώττισης (λεκτική ανάλυση, συντακτική ανάλυση, σημασιολογική ανάλυση, γεννήτρια ενδιάμεσου κώδικα (σε τριάδες), βελτιστοποίηση κώδικα, γεννήτρια συμβολικού κώδικα). Θεωρείστε ότι οι μεταβλητές f και c είναι float.

f = c * 1.8 + 32

Μπορείτε να χρησιμοποιήσετε τις ακόλουθες υποθετικές εντολές συμβολικής γλώσσας:

Εντολή συμβολικής γλώσσας Περιγραφή
LDF R1, A Φόρτωσε τον float αριθμό από τη θέση μνήμης στην οποία βρίσκεται η μεταβλητή Α στον καταχωρητή R1
STF A, R1 Αποθήκευσε τον float αριθμό από τον καταχωρητή R1 στη θέση μνήμης στην οποία βρίσκεται η μεταβλητή Α
MULF R1, R2, R3 Πολλαπλασίασε τα περιεχόμενα του καταχωρητή R2 με τα περιεχόμενα του καταχωρητή R3 και αποθήκευσε το αποτέλεσμα στον καταχωρητή R1 (πολλαπλασιασμός float τιμών)
ADDF R1, R2, R3 Άθροισε τα περιεχόμενα του καταχωρητή R2 με τα περιεχόμενα του καταχωρητή R3 και αποθήκευσε το αποτέλεσμα στον καταχωρητή R1 (πρόσθεση float τιμών)

Λύση

Άσκηση 2

Έστω η ακόλουθη γραμματική:

<assign> -> <id> = <expr>
<id>     -> A | B | C
<expr>   -> <id> + <expr>
          | <id> * <expr>
          | ( <expr> )
          | <id>

Γράψτε την παραγωγή της πρότασης:

A = B * (A + C)

Σχεδιάστε το δένδρο συντακτικής ανάλυσης για την ίδια πρόταση.

Λύση

Η λύση της άσκησης βρίσκεται στο Κεφάλαιο 3 - παράγραφοι 3.3.1.5 και 3.3.1.6

Άσκηση 3

Έστω η γραμματική χαρακτηριστικών:

1. Συντακτικός κανόνας: <assign> -> <var> = <expr>
    Σημασιολογικός κανόνας: <expr>.expected_type = <var>.actual_type

2. Συντακτικός κανόνας: <expr> -> <var>[2] + <var>[3]
    Σημασιολογικός κανόνας: <expr>.actual_type =
    if (<var>[2].actual_type = int_type) and (<var>[3].actual_type = int_type) then 
        int_type
    else 
        real_type
    end if
    Κατηγόρημα: <expr>.actual_type == <expr>.expected_type

3. Συντακτικός κανόνας: <expr> -> <var>
    Σημασιολογικός κανόνας: <expr>.actual_type = <var>.actual_type
    Κατηγόρημα: <expr>.actual_type == <expr>.expected_type

4. Συντακτικός κανόνας: <var> -> A | B | C 
    I. Συντακτικός κανόνας: <var> -> A
    Σημασιολογικός κανόνας: <var>.actual_type = look-up(A.value)
    
    II. Συντακτικός κανόνας: <var> -> B 
    Σημασιολογικός κανόνας: <var>.actual_type = look-up(B.value)
    
    III. Συντακτικός κανόνας: <var> ->  C
    Σημασιολογικός κανόνας: <var>.actual_type = look-up(C.value)

για την πρόταση:

Α = Α + Β

με A int_type και B real_type, σχεδιάστε το επισημειωμένο δένδρο συντακτικής ανάλυσης.

Άσκηση 4

Δώστε τη λειτουργική σημασιολογία για την εντολή while της C.

while (expr)
{
    stmts
}

Λύση

loop: control = expr
    if control == 0 goto out
    stmts
    goto loop
out: ...