Μετάφραση κατευθυνόμενη από τη σύνταξη

39
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-1 Μετάφραση κατευθυνόμενη από τη σύνταξη Ένας μεταγλωττιστής πρέπει όχι απλώς να αναγνωρίζει κατά πόσο μία πρόταση ακολουθεί τους κανόνες μίας γλώσσας, αλλά και να κάνει κάτι χρήσιμο με βάση αυτή την πρόταση. Οι σημασιολογικές ενέργειες (semantic actions) ενός συντακτικού αναλυτή είναι ένας από τους τρόπους για την ερμηνεία της σημασίας της πρότασης. Π.χ. στο YACC: expr : expr ‘+’ expr { $$ = $1 + $3 } Γενικά, για τη μετάφραση μίας προγραμματιστικής δομής ο μεταγλωττιστής χρειάζεται να διατηρεί πολλές πληροφορίες πέρα από τον πιθανό κώδικα που απαιτείται για την υλοποίησή της. Π.χ. ένας βρόχος επανάληψης for: for( i =1; i<100; i++) {…

description

Μετάφραση κατευθυνόμενη από τη σύνταξη. - PowerPoint PPT Presentation

Transcript of Μετάφραση κατευθυνόμενη από τη σύνταξη

Page 1: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-1

Μετάφραση κατευθυνόμενη από τη σύνταξη

• Ένας μεταγλωττιστής πρέπει όχι απλώς να αναγνωρίζει κατά πόσο μία πρόταση ακολουθεί τους κανόνες μίας γλώσσας, αλλά και να κάνει κάτι χρήσιμο με βάση αυτή την πρόταση. Οι σημασιολογικές ενέργειες (semantic actions) ενός συντακτικού αναλυτή είναι ένας από τους τρόπους για την ερμηνεία της σημασίας της πρότασης.

Π.χ. στο YACC:

expr : expr ‘+’ expr { $$ = $1 + $3 }

Γενικά, για τη μετάφραση μίας προγραμματιστικής δομής ο μεταγλωττιστής χρειάζεται να διατηρεί πολλές πληροφορίες πέρα από τον πιθανό κώδικα που απαιτείται για την υλοποίησή της. Π.χ. ένας βρόχος επανάληψης for:

for( i =1; i<100; i++) {…

Page 2: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-2

Μετάφραση κατευθυνόμενη από τη σύνταξη

• Ορισμοί κατευθυνόμενοι από τη σύνταξη (Syntax Directed Definitions) : μηχανισμός προσδιορισμού του τρόπου μετάφρασης μίας πρότασης μέσω απόδοσης χαρακτηριστικών (attributes) στα σύμβολα της γραμματικής που απαρτίζουν τον κανόνα παραγωγής που την περιγράφει.

• Ένας ορισμός κατευθυνόμενος από τη σύνταξη είναι μία γενίκευση μίας γραμματικής χωρίς συμφραζόμενα, όπου σε κάθε σύμβολο της γραμματικής (τερματικό ή μη) αντιστοιχούν ένα σύνολο χαρακτηριστικών . Κάθε κανόνας παραγωγής της γραμματικής συμπληρώνεται από ένα ή περισσότερους «σημασιολογικούς κανόνες» (semantic rules).

• Οι «σημασιολογικοί κανόνες» χρησιμεύουν στον υπολογισμό των χαρακτηριστικών .

Page 3: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-3

Ορισμοί κατευθυνόμενοι από τη σύνταξη• Οι σημασιολογικοί κανόνες μπορούν να παράγουν κώδικα

που υλοποιεί την αντίστοιχη δομή, να ενημερώνουν τον πίνακα συμβόλων, να παράγουν μηνύματα λάθους, κ.α.

• Απαιτείται ο προσδιορισμός της σειράς εκτίμησης των σημασιολογικών κανόνων. Οι σημασιολογικοί κανόνες προσδιορίζουν την εξάρτηση ανάμεσα στα χαρακτηριστικά αλλά όχι τη σειρά υπολογισμού τους.

• Η κατασκευή του γράφου εξάρτησης (dependency graph) ή και του συντακτικού δένδρου δεν είναι δεσμευτική. Εξαρτάται από την υλοποίηση.

Συμβολοσειράεισόδου

Συντακτικόδένδρο

Γράφοςεξάρτησης

Page 4: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-4

Χαρακτηριστικά συμβόλων• Τα χαρακτηριστικά των συμβόλων χωρίζονται σε :

- Παραγόμενα (synthesized attributes)

- Κληρονομούμενα (inherited attributes)

• Σε ένα ορισμό κατευθυνόμενο από την σύνταξη κάθε κανόνας παραγωγής A=a , συνοδεύεται από ένα σύνολο σημασιολογικών κανόνων της μορφής b=f(c1,c2, … ,cn) όπου f είναι συνάρτηση και c1,c2, … ,cn χαρακτηριστικά των συμβόλων του κανόνα (συμπεριλαμβανομένου του Α).

• Το b είναι παραγόμενο χαρακτηριστικό εάν ανήκει στο Α.

• Το b είναι κληρονομούμενο χαρακτηριστικό εάν ανήκει σε σύμβολα του δεξιού μέλους του κανόνα παραγωγής.

Page 5: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-5

Παράδειγμα• Ορισμός κατευθυνόμενος από την σύνταξη μίας

αριθμομηχανής:

• Τα τερματικά σύμβολα έχουν μόνο παραγόμενα χαρακτηριστικά. Επειδή δεν βρίσκονται στο αριστερό μέλος ενός κανόνα παραγωγής, ο υπολογισμός των χαρακτηριστικών τους γίνεται από τον λεκτικό αναλυτή.

Production Semantic Rule

L = E, n print(E.val)

E = E1 , "+", T E.val = E1.val+T.val

E=T E.val = T.val

T = T1 , "*", F T.val = T1.val * F.val

T=F T.val = F.valF="(", E, ")" F.val = E.valF=digit F.val = digit.lexval

αρίθμησηίδιων συμβόλων

newline

Page 6: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-6

Παραγόμενα Χαρακτηριστικά• Ένας ορισμός κατευθυνόμενος από τη σύνταξη ο οποίος

χρησιμοποιεί αποκλειστικά παραγόμενα χαρακτηριστικά ονομάζεται ορισμός με χαρακτηριστικά S (S-attributed definition).

• Το συντακτικό δένδρο στο οποίο σε κάθε κόμβο εμφανίζονται τα χαρακτηριστικά των αντίστοιχων συμβόλων ονομάζεται δένδρο με σχόλια (annotated parse tree) ή διακοσμημένο δένδρο (decorated tree).

• Σε ένα ορισμό με χαρακτηριστικά S, η εκτίμηση των σημασιολογικών κανόνων μπορεί να γίνει από κάτω-προς-τα-πάνω, ακόμα και κατά τη διάρκεια της συντακτικής ανάλυσης.

Page 7: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-7

Παράδειγμα διακοσμημένου δένδρου• Η είσοδος 2 + 3 * 5 οδηγεί στη δημιουργία του ακόλουθου

δένδρου με βάση την γραμματική του προηγούμενου παραδείγματος:

n

L

E.val = 17

digit.lexval=2 digit.lexval=3

digit.lexval=5F.val = 2 F.val = 3

F.val = 5T.val = 2

T.val = 3

E.val = 2

*

T.val = 15+

Page 8: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-8

Κληρονομούμενα Χαρακτηριστικά• Τα κληρονομούμενα χαρακτηριστικά ενός κόμβου του

δένδρου βασίζονται στα χαρακτηριστικά του γονέα του και/ή στα χαρακτηριστικά των συγγενικών του κόμβων (siblings).

• Τυπικά χρησιμοποιούνται για να δηλώσουν την εξάρτηση μίας δομής από το περιβάλλον στην οποία συναντάται, π.χ.

- για να διαπιστώσουμε αν μία μεταβλητή βρίσκεται στο δεξί ή αριστερό μέρος μίας ισότητας. Στην πρώτη περίπτωση πρέπει να χρησιμοποιήσουμε την τιμή της ενώ στη δεύτερη την διεύθυνσή της.

- για να ελέγξουμε το τύπο των μεταβλητών σε δηλώσεις της μορφής : var i, j : integer

• Το αρχικό σύμβολο S δεν έχει κληρονομούμενα χαρακτηρ.

Page 9: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-9

Παράδειγμα κληρονομούμενων χαρακτ.• Κανόνες παραγωγής για δήλωση μεταβλητών:

• Η διαδικασία addtype τροποποιεί κατάλληλα τον τύπο της μεταβλητής που έχει τοποθετηθεί στο πίνακα συμβόλων και βρίσκεται στη θέση id.entry.

Production Semantic Rule

D = L, ":", T L.in = T.typeT = int T.type = integerT = real T.type = real

L = L1 , "," , id L1.in = L.in

addtype(id.entry, L.in)

L = id addtype(id.entry, L.in)

Page 10: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-10

Υπολογισμός κληρον. χαρακτηριστικών• Ο υπολογισμός των κληρονομούμενων χαρακτηριστικών δεν

μπορεί να γίνει κατά την ελάττωση των κανόνων (reduction). Π.χ. για την δήλωση a, b, c : real το διακοσμημένο δένδρο σύμφωνα με τον προηγούμενο ορισμό είναι:

L.in = real

D

T.type = real

real

L.in = real

L.in = real

a

b

c

,

,

Page 11: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-11

Γράφος εξάρτησης• Ο υπολογισμός των χαρακτηριστικών μπορεί να γίνει με

τη βοήθεια του γράφου εξάρτησης που δημιουργείται ως εξής:

- για κάθε κόμβο του συντακτικού δένδρου και για κάθε χαρακτηριστικό του δημιουργούμε ένα κόμβο

- για κάθε σημασιολογικό κανόνα b=f(c1, … ,cn) δημιουργούμε μία ακμή από τον κόμβο του ci στο κόμβο του b.

• Στη περίπτωση που ένας σημασιολογικός κανόνας είναι κλήση μίας διαδικασίας, δημιουργούμε ένα τεχνητό (dummy) χαρακτηριστικό για αυτόν.

Page 12: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-12

Παράδειγμα γράφου εξάρτησης

L.in

D

T.type

real

L.in

L.in

a.addtype

b.addtype

c.addtype

,

,

a.entry

b.entry

c.entry

: dependencygraph node

Page 13: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-13

Εύρεση της σειράς υπολογισμού χαρακτ.• Τοπολογική ταξινόμηση (topological sort): ενός

ακυκλικού γράφου είναι οποιαδήποτε ταξινόμηση των κόμβων του, π.χ. m1, m2, … , mn ώστε να μην υπάρχει ακμή mimj με j<i .

• Η εύρεση μίας τοπολογικής ταξινόμησης ενός γράφου εξάρτησης εγγυάται την ορθή σειρά υπολογισμού των χαρακτηριστικών. Μέθοδοι εύρεσης:

- Mε τη βοήθεια του συντακτικού δένδρου

- Με τη βοήθεια των κανόνων παραγωγής (rule-based)

- Με μεθόδους που αγνοούν τις προτεραιότητες (oblivious)

Page 14: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-14

Εύρεση της σειράς υπολογισμού χαρακτ.• Εναλλακτικά: απαλειφή της διαφορετικής προτεραιότητας,

ώστε να μπορούν να υπολογιστούν κατά την ελάττωση των αντίστοιχων κανόνων:

- με τροποποίηση

της γραμματικής, π.χ.:

- με κατασκευή λιστών

από χαρακτηριστικά

Production Semantic Rule

D = id, L addtype(id.entry, L.type)

L = “,” , id , L1 addtype(id.entry, L1.type)

L.type = L1.type

L = “:”, T L.type = T.type

Production Semantic RuleD = L, ":", T foreach id in L.list

addtype(id.entry, T.type)

L = L1, ",", id L.list = node(id, L1.list)

L = id L.list = node(id)

Page 15: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-15

Συντακτικά Δένδρα• Το συντακτικό δένδρο που μπορεί να κατασκευάσει ο

συντακτικός αναλυτής ονομάζεται συμπαγές συντακτικό δένδρο (concrete syntax tree).

• Αφηρημένο συντακτικό δένδρο (abstract syntax tree ή AST) είναι μία συμπυκνωμένη μορφή του συμπαγούς συντ. Δένδρου όπου δεν υπάρχουν μη-τερματικοί κόμβοι.

n

L

E

digit digit

digitF F

FT T

E

*

T+

+

2 *

53

Page 16: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-16

Κατασκευή αφηρημένου συντ. δένδρου• Τα αφηρημένα συντακτικά δένδρα προσφέρουν ένα

μηχανισμό απαγκίστρωσης των επόμενων σταδίων μεταγλώττισης από την συντακτική ανάλυση.

• Οι εσωτερικοί κόμβοι ενός αφηρημένου συντακτικού δένδρου αναπαριστούν τελεστές και οι κόμβοι-απόγονοί τους τους τελεστέους ή τα ορίσματα πάνω στα οποία δρούν.

• Για την κατασκευή ενός AST για αριθμητικές εκφράσεις μπορούν να χρησιμοποιηθούν οι ακόλουθες συναρτήσεις σε συνδυασμό με ένα ορισμό κατευθυνόμενο από την σύνταξη και παραγόμενα χαρακτηριστικά:mknode(op, left, right)mkleaf(id, entry) : κόμβος για μεταβλητή τοποθετημένη στη θέση entry του πίνακα συμβόλων.mkleaf(num, val) : κόμβος για σταθερά με τιμή val.

Page 17: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-17

Παράδειγμα ορισμού για κατασκευή AST• Κάθε κόμβος ενός AST μπορεί να έχει τη μορφή εγγραφής

(record) με κατάλληλα πεδία.

• To ΑST που δημιουργείται για την έκφραση a-4+c:

Production Semantic Rule

E = E1 , "+", T E.ptr = mknode('+', E1.ptr, T.ptr)

E = E1 , "-", T E.ptr = mknode('-', E1.ptr, T.ptr)

E = T E.ptr = T.ptrT="(", E, ")" T.ptr = E.ptrT = id T.ptr = mknode(id, id.entry)T = num T.ptr = mknode(num, num.val)

+

- id

id 4num

c.entry

a.entry

Page 18: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-18

Απαλειφή κοινών υποεκφράσεων• Κατά την κατασκευή του AST μπορούμε να

τροποποιήσουμε τις συναρτήσεις mknode & mkleaf, ώστε σε περίπτωση που έχουν δημιουργηθεί προηγουμένως αντίστοιχοι κόμβοι να επιστρέφουν απλώς ένα δείκτη σε αυτούς. Η δομή που προκύπτει είναι ένα ακυκλικός κατευθυνόμενος γράφος (DAG).

• Π.χ. Για την έκφραση a+a*(b+c)+(b+c)*d

a

++

*

+

c

d

b

*

Page 19: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-19

Αξιολόγηση χαρακ. μαζί με τη συντ. ανάλυση

• Ένας ορισμός κατευθυνόμενος από την σύνταξη:– Προσδιορίζει τα χαρακτηριστικά που πρέπει να

υπολογιστούν, καθώς και τις εξαρτήσεις μεταξύ των κόμβων σε ένα συντακτικό δέντρο.

– ΔΕΝ περιγράφει το πώς και το πότε.• Σχέδιο μετάφρασης (translation scheme) :

γραμματική χωρίς συμφράζομενα όπου κομμάτια κώδικα (semantic actions) τοποθετούνται στο εσωτερικό των δεξιών μελών των κανόνων παραγωγής. Το σχέδιο μετάφρασης προσδιορίζει και το πώς και το πότε του υπολογισμού.

• Τόσο η συντακτική ανάλυση από πάνω-προς-τα-κάτω όσο και η από κάτω-προς-τα-πάνω, μπορούν να τροποποιηθούν κατάλληλα ώστε να επιτρέπουν τη πραγματοποίηση της μετάφρασης παράλληλα με την ΣΑ.

Page 20: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-20

Σχέδια Μετάφρασης• Σε ένα σχέδιο μετάφρασης οι σημασιολογικές ενέργειες

περικλείονται ανάμεσα σε {}

• Η γραφική αναπαράσταση της εφαρμογής ενός σχεδίου μετάφρασης αποτελείται από το συντακτικό δένδρο στο οποίο έχουν προστεθεί κόμβοι για τις σημασιολογικές ενέργειες.

Π.χ. E = E1, “*”, T , {E.val=E1.val * T.val}

E

E

T"*"

{E .va l=E1.va l * T .va l}

Page 21: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-21

Αξιολόγηση Χαρακ. από κάτω-προς-τα-πάνω

• Σε ένα ορισμό με χαρακτηριστικά S (S-attributed definition), η εκτίμηση των σημασιολογικών κανόνων μπορεί να γίνει κατά τη συντακτική ανάλυση από κάτω-προς-τα-πάνω, με τη χρήση μίας στοίβας χαρακτηριστικών.

Π.χ.

Α = Χ, Υ, Ζ, { Α.α = f(X.x, Y.y, Z.z) }

10

X25Y8Z

... ...

state val

Z.z

Y .y

X .x

topΑκριβώς πριν την ελάττωση του Α υπάρχουν στη στοίβα των χαρακτηριστικών όλες οι τιμές που απαιτούνται για τον υπολογισμό του Α.α :Α.α = f (val[top-2], val[top-1], val[top])

Page 22: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-22

Σχέδιο μετάφρασης από κάτω-προς-τα-πάνω

• Παράδειγμα:L = E, n, {printf("%i", val[top])}

E = E1 , "+", T, {val[ntop] = val[top-2] + val[top]}E = T

T = T1 , "*", F, {val[ntop] = val[top-2] * val[top]}T = FF = "(", E, ")”, {val[ntop] = val[top-1]}F = digit

• Ο δείκτης στη κορυφή της στοίβας (top) παίρνει μετά την ελάττωση του εκάστοτε κανόνα την τιμή ntop.

• Περιορισμός: τα κομμάτια κώδικα που πραγματοποιούν την μετάφραση μπορούν να εκτελεστούν μόνο αμέσως πριν την ελάττωση του κανόνα.

Page 23: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-23

Αξιολόγηση Χαρακτηριστικών κατά βάθος

• Ένας τρόπος για τον υπολογισμό των χαρακτηριστικών με την βοήθεια του συντακτικού δένδρου είναι με χρήση της ακόλουθης συνάρτησης:procedure dfvisit(n: node);begin

for each child node m of n, from left to right do begin

evaluate inherited attributes of m;dfvisit(m)

end;evaluate synthesized attributes of n

end

• Η κατά βάθος επίσκεψη των κόμβων του δένδρου από αριστερά προς τα δεξιά (depth-first order, left to right) αντιστοιχεί στον τρόπο με τον οποίο διατρέχει το συντ. δένδρο ένας ΣΑ LL(1).

Page 24: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-24

Ορισμοί με χαρακτηριστικά L• Τα κληρονομούμενα χαρακτηριστικά τα οποία μπορούν

υπολογιστούν επιτυχώς με τον τρόπο αυτό, πρέπει να εξαρτώνται μόνο από τα χαρακτηριστικά κόμβων τους οποίους έχουμε ήδη διατρέξει. Οι ορισμοί που ικανοποιούν αυτό τον περιορισμό ονομάζονται ορισμοί με χαρακτηριστικά L (L-attributed definitions).

• Ένας ορισμός κατευθυνόμενος από τη σύνταξη χαρακτηρίζεται ως ορισμός με χαρακτηριστικά L (L=left to right), όταν για κάθε κανόνα της μορφής

Α=Χ1, Χ2, …, Χn

τα κληρονομούμενα χαρακτηριστικά του συμβόλου Χj, εξαρτώνται από τα κληρονομούμενα χαρακτηριστικά του Α και τα χαρακτηριστικά των συμβόλων Χi με i<j.

Page 25: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-25

Αξιολ. Χαρακ. από πάνω-προς-τα-κάτω

• Κατασκευή σχεδίου μετάφρασης για ορισμούς με χαρακτηριστικά L και για ΣΑ από πάνω-προς-τα-κάτω: οι σημασιολογικές ενέργεις πρέπει να τηρούν τους εξής κανόνες:

– Οι ενέργειες που υπολογίζουν τα κληρονομούμενα χαρακτηριστικά ενός συμβόλου πρέπει να προηγούνται της εμφάνισής του στο δεξί μέλος της παραγωγής

– Οι ενέργειες που υπολογίζουν τα παραγόμενα χαρακτηριστικά ενός συμβόλου πρέπει να έπονται της εμφάνισής του στο δεξί μέλος της παραγωγής.

– Οι ενέργειες που υπολογίζουν τα παραγόμενα χαρακτηριστικά του συμβόλου του αριστερού μέλους πρέπει να έπονται όλων των συμβόλων από τα χαρακτηριστικά των οποίων εξαρτώνται.

Page 26: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-26

Παράδειγμα• Έστω το σχέδιο μετάφρασης:

S = A1, A2, {A1.in=1; A2.in=2}

A = a, {print(A.in) }

Σύμφωνα με του προηγούμενους κανόνες και για να είναι δυνατός ο υπολογισμός των χαρακτηριστικών από πάνω-προς-τα-κάτω, πρέπει να γίνει:

S = {A1.in=1},

A1, {A2.in=2} ,

A2

A = a, { print(A.in) }

Page 27: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-27

Πρόβλημα• Ποιό είναι το κατάλληλο σχέδιο μετάφρασης για τον

ακόλουθο ορισμό;

Production Semantic RuleS = B B.ps = 10

S.hr = B.ht

B = B1, B2 B1.ps = B.ps

B2.ps = B.ps

B.ht = max(B1.ht, B2.ht)

B = B1, sub, B2 B1.ps = B.ps

B2.ps = shrink(B.ps)

B.ht = disp(B1.ht, B2.ht)

B = text B.ht = text.h * B.ps

Page 28: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-28

Σχέδιο μετάφρ. για ΣΑ από πάνω-προς-τα-κάτω• Για την χρησιμοποίηση ΣΑ από πάνω-προς-τα-κάτω,

απαιτείται αρχικά η απαλειφή της αριστερής αναδρομικότητας. Αυτό συνεπάγεται την τροποποίηση των ενεργειών που υπολογίζουν τα παραγόμενα χαρακτηριστικά ως ακολούθως:

Α = Α1, Υ, {Α.α = g(Α1.α, Υ.y)}A = X , {A.a = f(X.x)}A = X, { R.i = f(X.x)}

R, { A.a = R.s }

R = Y, { R1.i = g( R.i, Y.y) }

R1, { R.s = R1.s}R = ε, {R.s = R.i}

Page 29: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-29

Παράδειγμα• Ορισμός:

Production Semantic Rule

Ε = E1, ‘+’ T; E.val = E1.val + T.val

Ε = E1, ‘-’ T; E.val = E1.val - T.val

E = T; E.val = T.valT = ‘(’, E, ‘)’ T.val = E.valT = num T.val = num.val

Page 30: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-30

Παράδειγμα (συνέχεια)• Σχέδιο μετάφρασης:

Ε = Τ, {E’.i = T.val}

Ε’ {E.val = E’.val}

Ε’ = ‘+’, Τ, {Ε1’.i = E.i + T.val}

Ε1’, {Ε’.val = Ε1’.val}

Ε’ = ‘-’, Τ, {Ε1’.i = E.i - T.val}

Ε1’, {Ε’.val = Ε1’.val}

Ε’ = ε {Ε’.val = Ε’.i}

T = ‘(’, E, ‘)’ {T.val = E.val}

T = num {T.val = num.val}

• Πώς θα έπρεπε να τροποποιηθεί το σχέδιο ώστε να δημιουργεί το ΑST;

Page 31: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-31

Mετάφραση με ΣΑ αναδρομικής κατάβασης Για κάθε μη-τερματικό σύμβολο δημιουργούμε μία

διαδικασία με παραμέτρους τα κληρονομούμενα χαρακτ. του συμβόλου. Η διαδικασία επιστρέφει τα παραγόμενα χαρακτηριστικά του. Υπάρχει μία τοπική μεταβλητή για κάθε χαρακτηριστικό κάθε συμβόλου του δεξιού μέλους.

Ανάλογα με το επόμενο σύμβολο εισόδου ο αναλυτής αποφασίζει ποιά διαδικασία θα καλέσει.

Για καθένα από τα τερματικά σύμβολα κρατά απλώς τα παραγόμενα χαρακτ. τους σε τοπικές μεταβλητές.

Για κάθε μη-τερματικό σύμβολο Β καλεί τη διαδικασία c=B(b1,b2,…,bn), όπου c είναι τα παραγόμενα και bi τα κληρονομούμενα χαρακτηριστικά του Β.

Εκτελεί τις σημασιολογικές ενέργειες αντικαθιστώντας τις αναφορές σε χαρακτ. με τις αντίστοιχες μεταβλητές.

Page 32: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-32

Παράδειγμα μετάφρασης• Έστω ο ορισμός με χαρακτ. L:

• Tο αντίστοιχο σχέδιο μετάφρασης σύμφωνα με τους κανόνες που αναφέρθηκαν είναι:

D = T, “:”, {L.in=T.type}, L

L = {id.type = L.in}, id, “,”, {L1.in= L.in}, L1

L = {id.type = L.in}, id

T = int {T.type = integer}

T = real {T.type = real}

Production Semantic RuleD = T, ":", L L.in = T.type

L = id, ",", L1 id.type=L.in

L1.in=L.in

L = id id.type=L.inT = int T.type = integerT = real T.type = real

Page 33: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-33

Παράδειγμα μετάφρασης (συνέχεια)• Ο κώδικας υλοποίησης του σχεδίου μετάφρασης είναι:void D()

{ int T_type, L_in;

T_type=T();

L_in = T_type;

if(next_tok == “:”) L(L_in);

else error();

}

void L(int L_in)

{ int id_type;

id_type = L_in;

id(id_type);

if(next_ tok == “,”) L(L_in);

}

int T(){ if(next_ tok == int_tok)

return(1); else if (next_ tok == real_tok)

return(2); else error();}

Page 34: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-34

Μετάφραση από κάτω-προς-τα-πάνω ορισμών L

• Οι ΣΑ από κάτω-προς-τα-πάνω δεν επιτρέπουν την ύπαρξη σημασιολογικών ενεργειών στο εσωτερικό του δεξιού μέλους της παραγωγής. Η λύση στο πρόβλημα αυτό ώστε να είναι δυνατή η εκτίμηση των κληρονομούμενων χαρακτηριστικών σε ένα ορισμό L, είναι με τη χρήση σημειωτών (markers):R = “+”, T, {print(‘+’)}, R | “-”, T, {print(‘-’)}, R

R = “+”, T, M , R | “-”, T, N, R M = ε, {print(‘+’)}Ν = ε, {print(‘-’)}

• Οι markers είναι μη-τερματικά σύμβολα με κανόνες παραγωγής στο κενό .

Page 35: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-35

Υπολ. των κληρονομούμενων χαρακτ.• O υπολογισμός των κληρονομούμενων χαρακτηριστικών

μπορεί να γίνει κατά την ελάττωση της παραγωγής του αντίστοιχου συμβόλου εφ όσον τα χαρακτηριστικά από τα οποία εξαρτώνται υπάρχουν ήδη στη στοίβα. Σε ένα ορισμό με χαρακτηριστικά L κάτι τέτοιο είναι εφικτό. Π.χ. έστω το σχέδιο μετάφρασης:

D = T, {L.in = T.type }

L

L = {L1.in=L.in},

L1 ",", id, {id.type=L.in}

L = id, {id.type=L.in}

T = int, {T.type = integer}

T = real, {T.type = real}

Page 36: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-36

Υπολ. κληρον. χαρακτ. από κάτω-προς-τα-πάνω• Κατά την ΣΑ της συμβολοσειράς εισόδου: real p, q, r θα

έχουμε:Stack Input Production

real p,q,rreal p,q,rT p,q,r T = realT p ,q,rT L ,q,r L = idT L , q,rT L , q ,rT L ,r L = L, idT L , rT L , rT L L = L, idD D = T L

Κατά την ελάττωση L=id, το Τ.type υπάρχει στη στοίβα στη θέση val[top-1]

Κατά την ελάττωση L=L, id το Τ.type υπάρχει στη στοίβα στη θέση val[top-3]

Page 37: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-37

Υπολ. κληρον. χαρακτ. (συνέχεια)• Τι γίνεται όταν δεν μπορεί να υπολογιστεί ακριβώς η θέση

των χαρακτηριστικών στη στοίβα;

• Π.χ.:

• To πρόβλημα λύνεται με την εισαγωγή ενός marker στο δεύτερο κανόνα:

Production Semantic RuleS= a,A,C C.i=A.sS= a,A,B,C C.i=A.sC=c C.s=f(C.i)

Trans. SchemeS= a,A,CS= a,A,B,M,CC=c , { val[ntop] = f(val[top-1]) }M=ε, { val[ntop] = val[top] }

Production Semantic RuleS= a,A,C C.i=A.sS= a,A,B,M,C M.i= A.s

C.i=Μ.sC=c C.s=f(C.i)M=ε M.s = M.i

Page 38: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-38

Αναδρομικοί Αξιολογητές (recursive evaluators)

• Στην περίπτωση που δεν είναι δυνατός ο υπολογισμός των χαρακτηριστικών παράλληλα με τη ΣΑ, είναι απαραίτητη η κατασκευή του συντακτικού δένδρου.

• Οι αναδρομικοί αξιολογητές διατρέχουν το συντακτικό δένδρο χρησιμοποιώντας αναδρομικές διαδικασίες, σε αναλογία με τους ΣΑ αναδρομικής κατάβασης. Δηλ. για κάθε μη-τερματικό σύμβολο υπάρχει μία (ή περισσότερες) διαδικασία(ες).

• H σειρά με την οποία ο αξιολογητής επισκέπτεται τους κόμβους του συντακτικού δένδρου δεν είναι σημαντική, αρκεί τα κληρονομούμενα χαρακτηριστικά ενός κόμβου να υπολογίζονται πριν την επίσκεψη σε αυτόν και τα παραγόμενα να υπολογίζονται πριν τον «εγκαταλείψουμε».

Page 39: Μετάφραση κατευθυνόμενη από τη σύνταξη

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 8-39

Παράδειγμα ορισμού μή-Lint A(node *n, int ai){ int li, ls, mi, ms, ri, rs, qi, qs;

switch(n->production){ case 1: li = l(ai);

ls = L(n->child1, li);mi = m(ls);ms = M(n->child2, mi);return( f(ms));break;

default: ri = r(ai);rs = R(n->child2, ri);qi = q(rs);qs = Q(n->child1, qi);return( f(qs)); }

}

Production Semantic RuleA = L, M L.i = l(A.i)

M.i = m(L.s)A.s = f(M.s)

A = Q, R R.i =r(A.i)Q.i = q(R.s)A.s = f(Q.s)