ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-1 Μετάφραση κατευθυνόμενη από τη σύνταξη Ένας μεταγλωττιστής πρέπει όχι απλώς να αναγνωρίζει κατά πόσο μία πρόταση ακολουθεί τους κανόνες μίας γλώσσας, αλλά και να κάνει κάτι χρήσιμο με βάση αυτή την πρόταση. Οι σημασιολογικές ενέργειες (semantic actions) ενός συντακτικού αναλυτή είναι ένας από τους τρόπους για την ερμηνεία της σημασίας της πρότασης. Π.χ. στο YACC: expr : expr ‘+’ expr { $$ = $1 + $3 } Γενικά, για τη μετάφραση μίας προγραμματιστικής δομής ο μεταγλωττιστής χρειάζεται να διατηρεί πολλές πληροφορίες πέρα από τον πιθανό κώδικα που απαιτείται για την υλοποίησή της. Π.χ. ένας βρόχος επανάληψης for: for( i =1; i<100; i++) {…
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-2 Μετάφραση κατευθυνόμενη από τη σύνταξη Ορισμοί κατευθυνόμενοι από τη σύνταξη (Syntax Directed Definitions) : μηχανισμός προσδιορισμού του τρόπου μετάφρασης μίας πρότασης μέσω απόδοσης χαρακτηριστικών (attributes) στα σύμβολα της γραμματικής που απαρτίζουν τον κανόνα παραγωγής που την περιγράφει. Ένας ορισμός κατευθυνόμενος από τη σύνταξη είναι μία γενίκευση μίας γραμματικής χωρίς συμφραζόμενα, όπου σε κάθε σύμβολο της γραμματικής (τερματικό ή μη) αντιστοιχούν ένα σύνολο χαρακτηριστικών. Κάθε κανόνας παραγωγής της γραμματικής συμπληρώνεται από ένα ή περισσότερους «σημασιολογικούς κανόνες» (semantic rules). Οι «σημασιολογικοί κανόνες» χρησιμεύουν στον υπολογισμό των χαρακτηριστικών.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-3 Ορισμοί κατευθυνόμενοι από τη σύνταξη Οι σημασιολογικοί κανόνες μπορούν να παράγουν κώδικα που υλοποιεί την αντίστοιχη δομή, να ενημερώνουν τον πίνακα συμβόλων, να παράγουν μηνύματα λάθους, κ.α. Απαιτείται ο προσδιορισμός της σειράς εκτίμησης των σημασιολογικών κανόνων. Οι σημασιολογικοί κανόνες προσδιορίζουν την εξάρτηση ανάμεσα στα χαρακτηριστικά αλλά όχι τη σειρά υπολογισμού τους. Η κατασκευή του γράφου εξάρτησης (dependency graph) ή και του συντακτικού δένδρου δεν είναι δεσμευτική. Εξαρτάται από την υλοποίηση.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-4 Χαρακτηριστικά συμβόλων Τα χαρακτηριστικά των συμβόλων χωρίζονται σε : - Παραγόμενα (synthesized attributes) - Κληρονομούμενα (inherited attributes) Σε ένα ορισμό κατευθυνόμενο από την σύνταξη κάθε κανόνας παραγωγής A=a, συνοδεύεται από ένα σύνολο σημασιολογικών κανόνων της μορφής b=f(c 1,c 2, …,c n ) όπου f είναι συνάρτηση και c 1,c 2, …,c n χαρακτηριστικά των συμβόλων του κανόνα (συμπεριλαμβανομένου του Α). Το b είναι παραγόμενο χαρακτηριστικό εάν ανήκει στο Α. Το b είναι κληρονομούμενο χαρακτηριστικό εάν ανήκει σε σύμβολα του δεξιού μέλους του κανόνα παραγωγής.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-5 Παράδειγμα Ορισμός κατευθυνόμενος από την σύνταξη μίας αριθμομηχανής: Τα τερματικά σύμβολα έχουν μόνο παραγόμενα χαρακτηριστικά. Επειδή δεν βρίσκονται στο αριστερό μέλος ενός κανόνα παραγωγής, ο υπολογισμός των χαρακτηριστικών τους γίνεται από τον λεκτικό αναλυτή. αρίθμηση ίδιων συμβόλων newline
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-6 Παραγόμενα Χαρακτηριστικά Ένας ορισμός κατευθυνόμενος από τη σύνταξη ο οποίος χρησιμοποιεί αποκλειστικά παραγόμενα χαρακτηριστικά ονομάζεται ορισμός με χαρακτηριστικά S (S-attributed definition). Το συντακτικό δένδρο στο οποίο σε κάθε κόμβο εμφανίζονται τα χαρακτηριστικά των αντίστοιχων συμβόλων ονομάζεται δένδρο με σχόλια (annotated parse tree) ή διακοσμημένο δένδρο (decorated tree). Σε ένα ορισμό με χαρακτηριστικά S, η εκτίμηση των σημασιολογικών κανόνων μπορεί να γίνει από κάτω-προς- τα-πάνω, ακόμα και κατά τη διάρκεια της συντακτικής ανάλυσης.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-7 Παράδειγμα διακοσμημένου δένδρου Η είσοδος * 5 οδηγεί στη δημιουργία του ακόλουθου δένδρου με βάση την γραμματική του προηγούμενου παραδείγματος:
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-8 Κληρονομούμενα Χαρακτηριστικά Τα κληρονομούμενα χαρακτηριστικά ενός κόμβου του δένδρου βασίζονται στα χαρακτηριστικά του γονέα του και/ή στα χαρακτηριστικά των συγγενικών του κόμβων (siblings). Τυπικά χρησιμοποιούνται για να δηλώσουν την εξάρτηση μίας δομής από το περιβάλλον στην οποία συναντάται, π.χ. - για να διαπιστώσουμε αν μία μεταβλητή βρίσκεται στο δεξί ή αριστερό μέρος μίας ισότητας. Στην πρώτη περίπτωση πρέπει να χρησιμοποιήσουμε την τιμή της ενώ στη δεύτερη την διεύθυνσή της. - για να ελέγξουμε το τύπο των μεταβλητών σε δηλώσεις της μορφής : var i, j : integer Το αρχικό σύμβολο S δεν έχει κληρονομούμενα χαρακτηρ.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-9 Παράδειγμα κληρονομούμενων χαρακτ. Κανόνες παραγωγής για δήλωση μεταβλητών: Η διαδικασία addtype τροποποιεί κατάλληλα τον τύπο της μεταβλητής που έχει τοποθετηθεί στο πίνακα συμβόλων και βρίσκεται στη θέση id.entry.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-10 Υπολογισμός κληρον. χαρακτηριστικών Ο υπολογισμός των κληρονομούμενων χαρακτηριστικών δεν μπορεί να γίνει κατά την ελάττωση των κανόνων (reduction). Π.χ. για την δήλωση a, b, c : real το διακοσμημένο δένδρο σύμφωνα με τον προηγούμενο ορισμό είναι:
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-11 Γράφος εξάρτησης Ο υπολογισμός των χαρακτηριστικών μπορεί να γίνει με τη βοήθεια του γράφου εξάρτησης που δημιουργείται ως εξής: - για κάθε κόμβο του συντακτικού δένδρου και για κάθε χαρακτηριστικό του δημιουργούμε ένα κόμβο - για κάθε σημασιολογικό κανόνα b=f(c 1, …,c n ) δημιουργούμε μία ακμή από τον κόμβο του c i στο κόμβο του b. Στη περίπτωση που ένας σημασιολογικός κανόνας είναι κλήση μίας διαδικασίας, δημιουργούμε ένα τεχνητό (dummy) χαρακτηριστικό για αυτόν.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-12 Παράδειγμα γράφου εξάρτησης
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-13 Εύρεση της σειράς υπολογισμού χαρακτ. Τοπολογική ταξινόμηση (topological sort): ενός ακυκλικού γράφου είναι οποιαδήποτε ταξινόμηση των κόμβων του, π.χ. m 1, m 2, …, m n ώστε να μην υπάρχει ακμή m i m j με j<i. Η εύρεση μίας τοπολογικής ταξινόμησης ενός γράφου εξάρτησης εγγυάται την ορθή σειρά υπολογισμού των χαρακτηριστικών. Μέθοδοι εύρεσης: - Mε τη βοήθεια του συντακτικού δένδρου - Με τη βοήθεια των κανόνων παραγωγής (rule-based) - Με μεθόδους που αγνοούν τις προτεραιότητες (oblivious)
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-14 Εύρεση της σειράς υπολογισμού χαρακτ. Εναλλακτικά: απαλειφή της διαφορετικής προτεραιότητας, ώστε να μπορούν να υπολογιστούν κατά την ελάττωση των αντίστοιχων κανόνων: - με τροποποίηση της γραμματικής, π.χ.: - με κατασκευή λιστών από χαρακτηριστικά
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-15 Συντακτικά Δένδρα Το συντακτικό δένδρο που μπορεί να κατασκευάσει ο συντακτικός αναλυτής ονομάζεται συμπαγές συντακτικό δένδρο (concrete syntax tree). Αφηρημένο συντακτικό δένδρο (abstract syntax tree ή AST) είναι μία συμπυκνωμένη μορφή του συμπαγούς συντ. Δένδρου όπου δεν υπάρχουν μη-τερματικοί κόμβοι.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-16 Κατασκευή αφηρημένου συντ. δένδρου Τα αφηρημένα συντακτικά δένδρα προσφέρουν ένα μηχανισμό απαγκίστρωσης των επόμενων σταδίων μεταγλώττισης από την συντακτική ανάλυση. Οι εσωτερικοί κόμβοι ενός αφηρημένου συντακτικού δένδρου αναπαριστούν τελεστές και οι κόμβοι-απόγονοί τους τους τελεστέους ή τα ορίσματα πάνω στα οποία δρούν. Για την κατασκευή ενός AST για αριθμητικές εκφράσεις μπορούν να χρησιμοποιηθούν οι ακόλουθες συναρτήσεις σε συνδυασμό με ένα ορισμό κατευθυνόμενο από την σύνταξη και παραγόμενα χαρακτηριστικά: mknode(op, left, right) mkleaf(id, entry) : κόμβος για μεταβλητή τοποθετημένη στη θέση entry του πίνακα συμβόλων. mkleaf(num, val) : κόμβος για σταθερά με τιμή val.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-17 Παράδειγμα ορισμού για κατασκευή AST Κάθε κόμβος ενός AST μπορεί να έχει τη μορφή εγγραφής (record) με κατάλληλα πεδία. To ΑST που δημιουργείται για την έκφραση a-4+c:
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-18 Απαλειφή κοινών υποεκφράσεων Κατά την κατασκευή του AST μπορούμε να τροποποιήσουμε τις συναρτήσεις mknode & mkleaf, ώστε σε περίπτωση που έχουν δημιουργηθεί προηγουμένως αντίστοιχοι κόμβοι να επιστρέφουν απλώς ένα δείκτη σε αυτούς. Η δομή που προκύπτει είναι ένα ακυκλικός κατευθυνόμενος γράφος (DAG). Π.χ. Για την έκφραση a+a*(b+c)+(b+c)*d
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-19 Αξιολόγηση χαρακ. μαζί με τη συντ. ανάλυση Ένας ορισμός κατευθυνόμενος από την σύνταξη: –Προσδιορίζει τα χαρακτηριστικά που πρέπει να υπολογιστούν, καθώς και τις εξαρτήσεις μεταξύ των κόμβων σε ένα συντακτικό δέντρο. –ΔΕΝ περιγράφει το πώς και το πότε. Σχέδιο μετάφρασης (translation scheme) : γραμματική χωρίς συμφράζομενα όπου κομμάτια κώδικα (semantic actions) τοποθετούνται στο εσωτερικό των δεξιών μελών των κανόνων παραγωγής. Το σχέδιο μετάφρασης προσδιορίζει και το πώς και το πότε του υπολογισμού. Τόσο η συντακτική ανάλυση από πάνω-προς-τα- κάτω όσο και η από κάτω-προς-τα-πάνω, μπορούν να τροποποιηθούν κατάλληλα ώστε να επιτρέπουν τη πραγματοποίηση της μετάφρασης παράλληλα με την ΣΑ.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-20 Σχέδια Μετάφρασης Σε ένα σχέδιο μετάφρασης οι σημασιολογικές ενέργειες περικλείονται ανάμεσα σε {} Η γραφική αναπαράσταση της εφαρμογής ενός σχεδίου μετάφρασης αποτελείται από το συντακτικό δένδρο στο οποίο έχουν προστεθεί κόμβοι για τις σημασιολογικές ενέργειες. Π.χ.E = E 1, “*”, T, {E.val=E 1.val * T.val}
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-21 Αξιολόγηση Χαρακ. από κάτω-προς-τα- πά νω Σε ένα ορισμό με χαρακτηριστικά S (S-attributed definition), η εκτίμηση των σημασιολογικών κανόνων μπορεί να γίνει κατά τη συντακτική ανάλυση από κάτω- προς-τα-πάνω, με τη χρήση μίας στοίβας χαρακτηριστικών. Π.χ. Α = Χ, Υ, Ζ, { Α.α = f(X.x, Y.y, Z.z) } Ακριβώς πριν την ελάττωση του Α υπάρχουν στη στοίβα των χαρακτηριστικών όλες οι τιμές που απαιτούνται για τον υπολογισμό του Α.α : Α.α = f (val[top-2], val[top-1], val[top])
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-22 Σχέδιο μετάφρασης από κάτω-προς-τα- πά νω Παράδειγμα: L = E, n, {printf("%i", val[top])} E = E 1, "+", T, {val[ntop] = val[top-2] + val[top]} E = T T = T 1, "*", F, {val[ntop] = val[top-2] * val[top]} T = F F = "(", E, ")”, {val[ntop] = val[top-1]} F = digit Ο δείκτης στη κορυφή της στοίβας (top) παίρνει μετά την ελάττωση του εκάστοτε κανόνα την τιμή ntop. Περιορισμός: τα κομμάτια κώδικα που πραγματοποιούν την μετάφραση μπορούν να εκτελεστούν μόνο αμέσως πριν την ελάττωση του κανόνα.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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).
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-24 Ορισμοί με χαρακτηριστικά L Τα κληρονομούμενα χαρακτηριστικά τα οποία μπορούν υπολογιστούν επιτυχώς με τον τρόπο αυτό, πρέπει να εξαρτώνται μόνο από τα χαρακτηριστικά κόμβων τους οποίους έχουμε ήδη διατρέξει. Οι ορισμοί που ικανοποιούν αυτό τον περιορισμό ονομάζονται ορισμοί με χαρακτηριστικά L (L-attributed definitions). Ένας ορισμός κατευθυνόμενος από τη σύνταξη χαρακτηρίζεται ως ορισμός με χαρακτηριστικά L (L=left to right), όταν για κάθε κανόνα της μορφής Α=Χ 1, Χ 2, …, Χ n τα κληρονομούμενα χαρακτηριστικά του συμβόλου Χ j, εξαρτώνται από τα κληρονομούμενα χαρακτηριστικά του Α και τα χαρακτηριστικά των συμβόλων Χ i με i<j.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-25 Αξιολ. Χαρακ. από πάνω-προς-τα-κ άτ ω Κατασκευή σχεδίου μετάφρασης για ορισμούς με χαρακτηριστικά L και για ΣΑ από πάνω-προς-τα-κάτω: οι σημασιολογικές ενέργεις πρέπει να τηρούν τους εξής κανόνες: –Οι ενέργειες που υπολογίζουν τα κληρονομούμενα χαρακτηριστικά ενός συμβόλου πρέπει να προηγούνται της εμφάνισής του στο δεξί μέλος της παραγωγής –Οι ενέργειες που υπολογίζουν τα παραγόμενα χαρακτηριστικά ενός συμβόλου πρέπει να έπονται της εμφάνισής του στο δεξί μέλος της παραγωγής. –Οι ενέργειες που υπολογίζουν τα παραγόμενα χαρακτηριστικά του συμβόλου του αριστερού μέλους πρέπει να έπονται όλων των συμβόλων από τα χαρακτηριστικά των οποίων εξαρτώνται.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-26 Παράδειγμα Έστω το σχέδιο μετάφρασης: S = A 1, A 2, {A 1.in=1; A 2.in=2} A = a, {print(A.in) } Σύμφωνα με του προηγούμενους κανόνες και για να είναι δυνατός ο υπολογισμός των χαρακτηριστικών από πάνω- προς-τα-κάτω, πρέπει να γίνει: S = {A 1.in=1}, A 1, {A 2.in=2}, A 2 A = a, { print(A.in) }
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-27 Πρόβλημα Ποιό είναι το κατάλληλο σχέδιο μετάφρασης για τον ακόλουθο ορισμό;
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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, { R 1.i = g( R.i, Y.y) } R 1, { R.s = R 1.s} R = ε, {R.s = R.i}
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-29 Παράδειγμα Ορισμός:
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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;
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-31 Mετάφραση με ΣΑ αναδρομικής κατάβασης Για κάθε μη-τερματικό σύμβολο δημιουργούμε μία διαδικασία με παραμέτρους τα κληρονομούμενα χαρακτ. του συμβόλου. Η διαδικασία επιστρέφει τα παραγόμενα χαρακτηριστικά του. Υπάρχει μία τοπική μεταβλητή για κάθε χαρακτηριστικό κάθε συμβόλου του δεξιού μέλους. Ανάλογα με το επόμενο σύμβολο εισόδου ο αναλυτής αποφασίζει ποιά διαδικασία θα καλέσει. Για καθένα από τα τερματικά σύμβολα κρατά απλώς τα παραγόμενα χαρακτ. τους σε τοπικές μεταβλητές. Για κάθε μη-τερματικό σύμβολο Β καλεί τη διαδικασία c=B(b 1,b 2,…,b n ), όπου c είναι τα παραγόμενα και b i τα κληρονομούμενα χαρακτηριστικά του Β. Εκτελεί τις σημασιολογικές ενέργειες αντικαθιστώντας τις αναφορές σε χαρακτ. με τις αντίστοιχες μεταβλητές.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-32 Παράδειγμα μετάφρασης Έστω ο ορισμός με χαρακτ. L: Tο αντίστοιχο σχέδιο μετάφρασης σύμφωνα με τους κανόνες που αναφέρθηκαν είναι: D = T, “:”, {L.in=T.type}, L L = {id.type = L.in}, id, “,”, {L 1.in= L.in}, L 1 L = {id.type = L.in}, id T = int {T.type = integer} T = real {T.type = real}
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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(); }
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-34 Μετάφραση από κάτω-προς-τα-πάνω ορισμών L Οι ΣΑ από κάτω-προς-τα-πάνω δεν επιτρέπουν την ύπαρξη σημασιολογικών ενεργειών στο εσωτερικό του δεξιού μέλους της παραγωγής. Η λύση στο πρόβλημα αυτό ώστε να είναι δυνατή η εκτίμηση των κληρονομούμενων χαρακτηριστικών σε ένα ορισμό L, είναι με τη χρήση σημειωτών (markers): R = “+”, T, {print(‘+’)}, R | “-”, T, {print(‘-’)}, R R = “+”, T, M, R | “-”, T, N, R M = ε, {print(‘+’)} Ν = ε, {print(‘-’)} Οι markers είναι μη-τερματικά σύμβολα με κανόνες παραγωγής στο κενό.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-35 Υπολ. των κληρονομούμενων χαρακτ. O υπολογισμός των κληρονομούμενων χαρακτηριστικών μπορεί να γίνει κατά την ελάττωση της παραγωγής του αντίστοιχου συμβόλου εφ όσον τα χαρακτηριστικά από τα οποία εξαρτώνται υπάρχουν ήδη στη στοίβα. Σε ένα ορισμό με χαρακτηριστικά L κάτι τέτοιο είναι εφικτό. Π.χ. έστω το σχέδιο μετάφρασης: D = T, {L.in = T.type} L L = {L 1.in=L.in}, L 1 ",", id, {id.type=L.in} L = id,{id.type=L.in} T = int,{T.type = integer} T = real,{T.type = real}
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-36 Υπολ. κληρον. χαρακτ. από κάτω-προς-τα-πάνω Κατά την ΣΑ της συμβολοσειράς εισόδου: real p, q, r θα έχουμε: Κατά την ελάττωση L=id, το Τ.type υπάρχει στη στοίβα στη θέση val[top-1] Κατά την ελάττωση L=L, id το Τ.type υπάρχει στη στοίβα στη θέση val[top-3]
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-37 Υπολ. κληρον. χαρακτ. (συνέχεια) Τι γίνεται όταν δεν μπορεί να υπολογιστεί ακριβώς η θέση των χαρακτηριστικών στη στοίβα; Π.χ.: To πρόβλημα λύνεται με την εισαγωγή ενός marker στο δεύτερο κανόνα:
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-38 Αναδρομικοί Αξιολογητές (recursive evaluators) Στην περίπτωση που δεν είναι δυνατός ο υπολογισμός των χαρακτηριστικών παράλληλα με τη ΣΑ, είναι απαραίτητη η κατασκευή του συντακτικού δένδρου. Οι αναδρομικοί αξιολογητές διατρέχουν το συντακτικό δένδρο χρησιμοποιώντας αναδρομικές διαδικασίες, σε αναλογία με τους ΣΑ αναδρομικής κατάβασης. Δηλ. για κάθε μη-τερματικό σύμβολο υπάρχει μία (ή περισσότερες) διαδικασία(ες). H σειρά με την οποία ο αξιολογητής επισκέπτεται τους κόμβους του συντακτικού δένδρου δεν είναι σημαντική, αρκεί τα κληρονομούμενα χαρακτηριστικά ενός κόμβου να υπολογίζονται πριν την επίσκεψη σε αυτόν και τα παραγόμενα να υπολογίζονται πριν τον «εγκαταλείψουμε».
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών8-39 Παράδειγμα ορισμού μή-L int 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)); } }