ΣΑ από κάτω-προς-τα-πάνω

61
ΕΠΛ223 Θεωρία και Πρακτική Μεταγλωττιστών 6-1 ΣΑ από κάτω-προς-τα-πάνω Από πάνω προς τα κάτωΑπό κάτω προς τα πάνω ΣΑ από κάτω-προς-τα-πάνω : αναζήτηση συμβολοσειρών που υπάρχουν στο δεξί μέρος ενός κανόνα παραγωγής και αντικατάστασή τους από το αντίστοιχο μη-τερματικό σύμβολο.

Upload: ceana

Post on 16-Mar-2016

52 views

Category:

Documents


0 download

DESCRIPTION

ΣΑ από κάτω-προς-τα-πάνω. ΣΑ από κάτω-προς-τα-πάνω : αναζήτηση συμβολοσειρών που υπάρχουν στο δεξί μέρος ενός κανόνα παραγωγής και αντικατάστασή τους από το αντίστοιχο μη-τερματικό σύμβολο. Από πάνω προς τα κάτω. Από κάτω προς τα πάνω. Ηandles. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ΣΑ από κάτω-προς-τα-πάνω

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

ΣΑ από κάτω-προς-τα-πάνω

Από πάνω προς τα κάτω Από κάτω προς τα πάνω

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

Page 2: ΣΑ από κάτω-προς-τα-πάνω

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

Ηandles• Handles : τμήματα (substrings) μίας συμβολοσειράς τα

οποία μπορούν να αντικατασταθούν από τα αριστερά μέρη κανόνων παραγωγής, αντιστρέφοντας έτσι την παραγωγή που την δημιούργησε από το αρχικό σύμβολο S. Όλες οι συμβολοσειρές που είναι δυνατό να αντικατασταθούν δεν είναι handles. Π.χ.: έστω η γραμματική: S = “a”, A, “c”, B, “e”; A = A, “b”| “b”; B = “d”;Συμβολοσειρά Κανόνας Συμβολοσειρά Κανόνας

"abbcde" "abbcde""a",A,"bcde" A="b" "a",A,"bcde" A="b""a", A, "cde" A=A, "b" "a", A, A, "cde" A="b""a", A, "c", B, "e" B="d" ? ?S S = "a", A, "c", B, "e"

Page 3: ΣΑ από κάτω-προς-τα-πάνω

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

Ηandles (συνέχεια)• Δεξιά προτασιακή μορφή (right sentential form)

ονομάζεται μία συμβολοσειρά γ, αν υπάρχει δεξιότερη παραγωγή S γ.

• Handle μίας δεξιάς προτασιακής μορφής γ, ονομάζεται ο κανόνας Α=β και η θέση που το β συναντάται στο γ, έτσι ώστε αν το Α αντικαταστήσει το β στην γ παίρνουμε τη δεξιά προτασιακή μορφή που προηγήθηκε στη δεξιότερη παραγωγή της γ από το S.Έτσι, εάν S α, A, w α, β, wτότε ο κανόνας Α=β και η θέση που ακολουθεί το a, αποτελούν ένα handle της συμβολοσειράς a, β, w, όπου το w περιέχει μόνο τερματικά σύμβολα.

• Αντίστοιχα ορίζεται και το handle μίας αριστερής προτ. μορφής.

*R

R

*

R

Page 4: ΣΑ από κάτω-προς-τα-πάνω

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

Ηandle pruning• Κάθε handle ισοδυναμεί με ένα εσωτερικό κόμβο

του συντακτικού δένδρου.• Έτσι, η αντιστροφή μίας δεξιότερης παραγωγής

μπορεί να επιτευχθεί με το «κλάδεμα» (pruning) των handles της δεξιάς προτασιακής μορφής. Π.χ. Ε = Ε,“+”,E | Ε,“*”,E | “(”,E, “)” | id;

Συμβολοσειρά Handle Κανόναςid, "+", id, "*", id id E=idE, "+", id, "*", id id E=idE, "+", E, "*", id id E=idE, "+", E, "*", E E, "*", E E=E, "*", EE, "+", E E, "+", E E=E, "+", EE

Page 5: ΣΑ από κάτω-προς-τα-πάνω

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

ΣΑ ολίσθησε-ελάττωσε• Βασικό πρόβλημα της από κάτω-προς-τα-πάνω

προσέγγισης είναι η επιλογή των handles:– Εύρεση της κατάλληλης συμβολοσειράς– Επιλογή του κατάλληλου κανόνα για αντικατάσταση

της συμβολοσειράς.• Συντ. Αναλυτής ολίσθησης-ελάττωσης (shift-

reduce parser): χρησιμοποιεί μία στοίβα στην οποία τοποθετούνται τα σύμβολα εισόδου μέχρι να σχηματιστεί στην κορυφή της στοίβας ένα handle. Τότε, τα σύμβολα που αποτελούν το δεξί μέλος του handle αντικαθίστανται στη κορυφή της στοίβας από το αριστερό μέλος.

Page 6: ΣΑ από κάτω-προς-τα-πάνω

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

ΣΑ ολίσθησε-ελάττωσε (συνέχεια)• Ενέργειες ΣΑ “ολίσθησης-ελάττωσης”:

1. Ολίσθηση (shift) : τοποθέτηση των συμβόλων εισόδου στη στοίβα μέχρι το σχηματισμό ενός handle.

2. Ελάττωση (reduce) : αντικατάσταση του r.h.s. από το l.h.s του handle στη κορυφή της στοίβας (δεν επηρεάζει την είσοδο).

3. Αποδοχή (accept) : επιτυχής ολοκλήρωση της ΣΑ. Η συμβολοσειρά εισόδου αναγνωρίζεται όταν με την ανάγνωση του τέλους της $, η στοίβα περιέχει μόνο το αρχικό σύμβολο της γραμματικής.

4. Σφάλμα (error).• Αρχικά η στοίβα περιέχει μόνο το σύμβολο $ σε αντίθεση

με την προσέγγιση LL(1) όπου η στοίβα περιέχει τα $ S .

Page 7: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα

Διφορούμενη γραμματική συγκρούσεις (conficts)

Στοίβα Συμβ. Εισόδου Ενέργεια Κανόνας$ id, "+", id, "*", id, $ shift$ id "+", id, "*", id, $ reduce Ε = id$ E "+", id, "*", id, $ shift$ E "+" id, "*", id, $ shift$ E "+" id "*", id, $ reduce Ε = id$ E "+" E id, $ shift$ E "+" E "*" $ shift$ E "+" E "*" id $ reduce Ε = id$ E "+" E "*" E $ reduce Ε = E, "*", E$ E "+" E $ reduce Ε = E, "+", E$ E $ accept

Page 8: ΣΑ από κάτω-προς-τα-πάνω

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

Συγκρούσεις• Συμβαίνουν όταν ο ΣΑ μπορεί να επιλέξει ανάμεσα σε μία

ποικιλία ενεργειών για την συνέχιση της ανάλυσης. Οι συγκρούσεις μπορούν να λυθούν είτε αλλάζοντας την γραμματική, είτε παίρνοντας αποφάσεις κατά την ανάλυση.

• Διακρίνουμε δύο ειδών συγκρούσεις:– Σύγκρουση ολίσθησης-ελάττωσης (shift-reduce

conflict). Π.χstmt = “if”,E,“then”,stmt | “if”,E,“then”,stmt,“else”,stmt |…

– Σύγκρουση ελάττωσης-ελάττωσης (reduce-reduce conflict)

Στοίβα Συμβ. Εισόδου Ενέργεια$ "if" E "then" stmt "else", . . .$ ?

Page 9: ΣΑ από κάτω-προς-τα-πάνω

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

Συγκρούσεις (συνέχεια)• Π.χ. Έστω η γραμματική

stmt = id, “(”, param_list, “)” | expr, “:=”, expr ;param_list = {param_list}, “,”, parameter ;parameter = id ;expr = id, “(”, expr_list, “)” | id ;expr_list = {expr_list}, “,” , expr ;

Πώς θα ερμηνευτεί μία πρόταση της μορφής Α(i,j);

Λύσεις;

Στοίβα Συμβ. Εισόδου Ενέργεια Κανόνας$ id "(" id ",", id, ")" . . .$ reduce parameter = id

Στοίβα Συμβ. Εισόδου Ενέργεια Κανόνας$ id "(" id ",", id, ")" . . .$ reduce expr = id

Page 10: ΣΑ από κάτω-προς-τα-πάνω

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

Συντακτικοί αναλυτές LR(k)• L : ανάγνωση της εισόδου από αριστερά προς τα

δεξιά (left to right scanning)• R : δεξιότερη παραγωγή (rightmost derivation)• (k): k σύμβολα εισόδου χρησιμοποιούνται για την

επιλογή της επόμενης ενέργειας του ΣΑ (look-ahead symbols). Όταν παραλείπεται εννοείται ότι k=1.

• Πώς συμβιβάζονται η ανίχνευση της εισόδου από αριστερά προς τα δεξιά, με τη δεξιότερη παραγωγή;

• Shift-reduce : μία απλή μορφή LR.

Page 11: ΣΑ από κάτω-προς-τα-πάνω

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

Χαρακτηριστικά των ΣΑ LR(k)• Οι ΣΑ LR μπορούν να αναγνωρίσουν σχεδόν όλες τις

προγραμματιστικές δομές που μπορούν να περιγραφούν με γραμματικές χωρίς συμφραζόμενα.

• Οι γραμματικές που μπορούν να αναγνωριστούν με LR είναι κανονικό υπερσύνολο αυτών που μπορούν να αναγνωριστούν από LL.

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

• Οι αναλυτές LR είναι πολύ δύσκολο να κατασκευαστούν «χειρονακτικά».

• Οι αναλυτές LR μπορούν να ανιχνεύσουν ένα συντακτικό λάθος το συντομότερο δυνατό με δεδομένη την από δεξιά-προς-τα-αριστερά σάρωση της εισόδου.

Page 12: ΣΑ από κάτω-προς-τα-πάνω

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

Yλοποίηση αναλυτή LR

• H στοίβα περιέχει μία συμβολοσειρά της μορφής : s0, X0, …, Xm, sm όπου Χi είναι σύμβολα της γραμματικής και si είναι καταστάσεις (states) που κωδικοποιούν την πληροφορία που βρίσκεται από κάτω τους στη στοίβα.

LR pars ingprogram

a1 $a i a nInput

sm

X m -1

sm -1

X m

s 0

Stack

action goto

Output

Page 13: ΣΑ από κάτω-προς-τα-πάνω

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

Yλοποίηση αναλυτή LR (συνέχεια)• H κατάσταση (configuration) του αναλυτή χαρακτηρίζεται

πλήρως από το ζεύγος(s0 X1 s1…. Xm sm , ai ai+1 …. an $)

που αντιστοιχεί στη δεξιά προτασιακή μορφήΧ1, … Χm, ai, ... an

• H επόμενη ενέργεια του αναλυτή καθορίζεται από το στοιχείο του πίνακα action[sm, ai]:

1. action[sm, ai] = shift s, όπου s κατάσταση, τότε ο αναλυτής πάει στην κατάσταση (s0 X1 s1…. Xm sm ai s, ai+1 …. an $)

Page 14: ΣΑ από κάτω-προς-τα-πάνω

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

Yλοποίηση αναλυτή LR (συνέχεια)2. action[sm, ai] = reduce A=β , o αναλυτής πάει στην

κατάσταση(s0 X1 s1…. Xm-r sm-r A s, ai ai+1 …. an $)

όπου r=|β| και β= Xm-r+1 …. Xm

Επίσης, s = goto[sm-r ,A] όπου βέβαια Α είναι μη τερματικό.

3. action[sm, ai] = accept

4. action[sm, ai] = error

• Σύμφωνα με τα παραπάνω, ο πίνακας action έχει μία στήλη για κάθε τερματικό σύμβολο, και ο πίνακας goto μία στήλη για κάθε μη-τερματικό σύμβολο

Page 15: ΣΑ από κάτω-προς-τα-πάνω

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

Ψευδοκώδικας υλοποίησης αναλυτή LRa = yylex() // first input symbolwhile (1) {

let s state on top of the stackif action[s,a] = shift s’ then {

push a; push s’ a = yylex() }

else if action[s,a] = reduce A = β then {pop 2*|β| symbolslet s’ state on top of the stackpush Apush goto[s’,A]output A = β }

else if action[s,a] = accept then returnelse error() }

Page 16: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα• Έστω η γραμματική:(1) Ε = Ε, “+”, Τ;(2) Ε = Τ;(3) Τ = Τ, “*”, F;(4) T = F;(5) F = “(”, E, “)”;(6) F = id;

acc = acceptblank =errorsi: shift state #iri : reduce by rule #i

State id + * ( ) $ E T F0 s5 s4 1 2 31 s6 acc2 r2 s7 r2 r23 r4 r4 r4 r44 s5 s4 8 2 35 r6 r6 r6 r66 s5 s4 9 37 s5 s4 108 s6 s119 r1 s7 r1 r110 r3 r3 r3 r311 r5 r5 r5 r5

action goto

Page 17: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα (συνέχεια)• Αναγνώριση της συμβολοσειράς id*id+id

Στοίβα Είσοδος action0 id * id + id $ shift0 id 5 * id + id $ reduce by F = id0 F 3 * id + id $ reduce by Τ = F0 T 2 * id + id $ shift0 T 2 "*" 7 id + id $ shift0 T 2 "*" 7 id 5 + id $ reduce by F = id0 T 2 "*" 7 F 10 + id $ reduce by T = T * F0 T 2 + id $ reduce by E = T0 E 1 + id $ shift0 E 1 "+" 6 id $ shift0 E 1 "+" 6 id 5 $ reduce by F = id0 E 1 "+" 6 F 3 $ reduce by T = F0 E 1 "+" 6 T 9 $ reduce by E = E + T0 E 1 $ accept

Page 18: ΣΑ από κάτω-προς-τα-πάνω

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

Βιώσιμα Προθέματα (viable prefixes)• Βιώσιμa πρoθέματα είναι το σύνολο των προθεμάτων των

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

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

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

• Ο πίνακας* goto είναι ένα ΝΠΑ που αναγνωρίζει τα βιώσιμα προθέματα.

Page 19: ΣΑ από κάτω-προς-τα-πάνω

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

Items• LR(0) item μίας γραμματικής G είναι ένα κανόνας της με το

σύμβολο • (dot) σε κάποια θέση στο δεξί του μέλος. Π.χ. Για το κανόνα Α=Χ,Υ,Ζ υπάρχουν 4 items:A = •, X, Y, ZA = X, •, Y, ZA = X, Y, •, ZA = X, Y, Z, •

• Ένα item μπορεί να αναπαρασταθεί από τον αριθμό του κανόνα και τη θέση της τελείας.

• Ότι προηγείται της τελείας σε ένα item αντιπροσωπεύει το πρόθεμα του δεξιού μέλους ενός κανόνα το οποίο έχει εμφανιστεί στη στοίβα. Ότι ακολουθεί την τελεία αντιπροσωπεύει ότι περιμένουμε να εμφανιστεί.

Page 20: ΣΑ από κάτω-προς-τα-πάνω

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

Συντακτικός αναλυτής LR(0)• LR(0) είναι οι γραμματικές που μπορούν να αναλυθούν,

δηλ. ο ΣΑ μπορεί να αποφασίσει σε ποιά ενέργεια θα προβεί, ελέγχοντας μόνο τα περιεχόμενα της στοίβας.

• Κατασκευή ενός ΜΠΑ που αναγνωρίζει τα βιώσιμα προθέματα και κάθε κατάστασή του οποίου αντιστοιχεί σε ένα item της γραμματικής:

1. Αν S το αρχικό σύμβολο της γραμματικής G δημιουργούμε την επαυξημένη γραμματική G’ με τον πρόσθετο κανόνα S’ = S.

2. Δημιουργούμε για κάθε item της γραμματικής μία κατάσταση του αυτόματου.

3. Για κάθε item της μορφής A = Χ, •, Y δημιουργούμε μία ε-μετάβαση στα item της μορφής Y = •, Z

Page 21: ΣΑ από κάτω-προς-τα-πάνω

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

Συντακτικός αναλυτής LR(0) (συνέχεια)4. Για κάθε item της μορφής A = Χ, •, Y, Z δημιουργούμε μία

μετάβαση με το σύμβολο Υ στο item A = Χ, Y, •, Z όπου Υ μπορεί να είναι τερματικό ή μη-τερματικό.

5. Η $-μετάβαση από το item S’ = S, • αναγνωρίζει την είσοδο.

• Μετατρέποντας το ΜΠΑ σε ΝΠΑ: η συνάρτηση Closure(I):Closure(I)

repeat for any item A = Χ, •, Y, Z in I

for any production Y = •, W I = I {Y = •, W}

until I does not changereturn I

Page 22: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα της συνάρτησης Closure• Έστω η γραμματική

S’ = S ;S = “(”, L, “)” | id ;L = S | L, “,” , S ;

closure( {S’ = •, S}) = {S’ = •, S , S = •,“(”, L, “)” , S = •, id }

closure( {S = “(”, •,L, “)” }) = {S = “(”, •,L, “)” , L = •, S , L = •, L , “,” , S , S = •,“(”, L, “)” , S = •, id }

Page 23: ΣΑ από κάτω-προς-τα-πάνω

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

Συνάρτηση Goto• H συνάρτηση Goto(I, X):, όπου Ι σύνολο από items και Χ

σύμβολο της γραμματικής:Goto(I,X)

let J = for all items A = Y, •, X, Z in I

J = J {A = Y, X, •, Z}return closure(J)

• Π.χ. Goto({S’ = •, S , S = •,“(”, L, “)” , S = •, id}, “(”)== closure(S = “(”, •, L, “)” ) = = {S = “(”, •,L, “)” , L = •, S ,L = •, L , “,” , S , S = •,“(”, L, “)” , S = •, id }

Page 24: ΣΑ από κάτω-προς-τα-πάνω

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

Aλγόριθμος κατασκευής ΝΠΑ, ΣΑ LR(0)• Έστω Τ το σύνολο των καταστάσεων του ΝΠΑ και Ε το

σύνολο των μεταβάσεων.Let T = Closure( S’= •, S )Let E = {}repeat for each state I in Tfor each item A = a, •, X, b in I let J = goto(I, X) T = T J E = E {I J}until T and E don’t change

X

Page 25: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή πινάκων action, goto1. Για κάθε Χ-μετάβαση ΙJ, όπου Χ είναι

τερματικό θέσε action[I, X] = shift J. Aν το Χ είναι μη-τερματικό τότε goto[I,X]=J.

2. Aν μία κατάσταση Ι περιέχει το item S’=S, • τότε action[I,$]=accept. Δηλ., η $-μετάβαση από το item S’ = S, • αναγνωρίζει την είσοδο.

3. Aν μία κατάσταση Ι περιέχει το item Α = X, • τότε για κάθε τερματικό σύμβολο x θέσεaction[I, x] = reduce A=X

4. Kάθε κενό κελί των πινάκων action και goto ισοδυναμεί με σφάλμα.

Page 26: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα ΝΠΑ για τη γραμματική των λιστών

S ’ . SS . ( L )

S . id S ( . L )L . S

L . L , SS . ( L )S . id

(

S id .id

(

id

S ( L . )L L . , S

L

L S .

S

L L , . SS . ( L )

S . id

id L L , S .S

S ( L ) .

)

S ’ S .

S

1 2

3

4

5

67

8 9

,(

Page 27: ΣΑ από κάτω-προς-τα-πάνω

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

Πίνακες action και goto (0) S’ = S;(1) S = “(”, L, “)”;(2) S = id;(3) L = S;(4) L = L, “,” , S;

State ( ) id , $ S L1 s3 s2 42 r2 r2 r2 r2 r23 s3 s2 7 54 acc5 s6 s86 r1 r1 r1 r1 r17 r3 r3 r3 r3 r38 s3 s2 99 r4 r4 r4 r4 r4

action goto

Page 28: ΣΑ από κάτω-προς-τα-πάνω

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

Περιορισμοί της προσέγγισης LR(0)• Μπορούμε να κατασκευάσουμε ένα ΣΑ LR(0) μόνο αν το

πρόθεμα που υπάρχει στη στοίβα προσδιορίζει μοναδικά την ενέργεια που πρέπει να εκτελεστεί (ολίσθηση ή ελάττωση)

• Περισσότερο περίπλοκες γραμματικές προκαλούν συγκρούσεις

L = L , S, • L = L , S, •S = S, • , L

shift / reduceL = S , L, •

L = L, •

reduce / reduceok

• Λύση : η χρήση χαρακτήρων της εισόδου (look-ahead) για την επίλυση των συγκρούσεων.

Page 29: ΣΑ από κάτω-προς-τα-πάνω

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

Συντακτικός αναλυτής SLR(1)• SLR (Simple LR) : διαφέρει από τον LR(0) στην

κατασκευή του πίνακα action από το ΝΠΑ. Συγκεκριμένα, ο μοναδικός κανόνας που διαφέρει είναι αυτός που αφορά τις ελαττώσεις:. . .

3. Aν μία κατάσταση Ι περιέχει το item Α = X, • τότε για κάθε τερματικό σύμβολο x που ανήκει στο σύνολο FOLLOW(Α), θέσεaction[I, x] = reduce A=X. . .

Page 30: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα κατασκευής συντ. πίνακα SLR• Έστω η γραμματική:S = A, B ;A= “x”, A, “y” | ε ;B = “y”, B | “y” ;

Πρώτο βήμα η επαύξηση της γραμματικής :(1) S’ = S ; (2) S = A, B ;(3) A= “x”, A, “y” ;(4) A = ε ;(5) B = “y”, B ;(6) B = “y” ;

Page 31: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα συντ. πίνακα SLR (συνέχεια)• Κατασκευή του αυτόματου που αναγνωρίζει τα

βιώσιμα προθέματα:

S ' = . , SS = . , A , BA = . , "x", A , "y"A = .

y

S = A , . , BB = ., "y", BB = ., "y"

S = A , B , .

S ' = S , .A = "x", . , A , "y"A = . , "x", A , "y"A = .

A = "x", A , . ,"y"A = "x", A , "y", .

B = "y", . , BB = "y", .B = ., "y", BB = ., y

B = "y", B , .

1 23

45 6

789

A

S

B

A

y

B

x

x

y

Page 32: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα συντ. πιν. SLR (συνέχεια 2)• (1) FOLLOW(S’) = {$}

(1) FOLLOW(S’) FOLLOW(S) FOLLOW(S) ={$}(2) FOLLOW(S) FOLLOW(B) FOLLOW(B) ={$}(3), (2) FOLLOW(A)={“y”} (FIRST(B) -{ε}) FOLLOW(A) = {“y”}

• Συμπλήρωμα των πινάκων action & goto:

State x y $ S A B1 s5 r4 4 22 s6 33 r24 acc5 s5 r4 86 s6 r6 77 r58 s99 r3

gotoaction

Page 33: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα συντ. πιν. SLR (συνέχεια 3)• Συντ. ανάλυση της συμβολοσειράς “xxyyyy”:

State x y $ S A B1 s5 r4 4 22 s6 33 r24 acc5 s5 r4 86 s6 r6 77 r58 s99 r3

gotoactionΣτοίβα Είσοδος Ενέργεια

1 x x y y y y s51 x 5 x y y y y s51 x 5 x 5 y y y y r41 x 5 x 5 A 8 y y y y s91 x 5 x 5 A 8 y 9 y y y r31 x 5 A 8 y y y s91 x 5 A 8 y 9 y y r31 A 2 y y s61 A 2 y 6 y s61 A 2 y 6 y 6 $ r61 A 2 y 6 B 7 $ r51 A 2 B 3 $ r21 S 4 $ acc

Page 34: ΣΑ από κάτω-προς-τα-πάνω

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

Είδη αναλυτών LR• LR(0)/ SLR : εύκολη υλοποίηση, λιγότερη ισχυρή

προσέγγιση (μικροί πίνακες). Μπορεί μία γραμματική να μην είναι διφορούμενη αλλά να μην είναι δυνατό να κατασκευαστεί SLR που να την αναλύει.

• Κανονικός LR (canonical LR) : δύσκολη υλοποίηση, πιο ισχυρή προσέγγιση (μεγάλοι πίνακες)

• LALR (Look Ahead LR) : δυσκολία υλοποίησης και ικανότητες ανάμεσα στους SLR και κανονικό LR.

Page 35: ΣΑ από κάτω-προς-τα-πάνω

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

Τα προβλήματα της ΣΑ SLR(1)• Έστω η γραμματική

S = L, “=”, R ;S = R ;L = “*”, R ;L = id ;R = L ;

Mία από τις καταστάσεις του ΝΠΑ που αναγνωρίζει τα βιώσιμα προθέματα είναι η I2 = {S = L,•, “=”, R , R = L,•}

Καθώς “=” FOLLOW(L) , η ύπαρξη στη στοίβα της συμβολοσειράς L οδηγεί στην ελάττωση R = L

Η συμβολοσειρά R, “=”… όμως δεν ανήκει στη γλώσσα.

Page 36: ΣΑ από κάτω-προς-τα-πάνω

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

LR(1) Items• LR(1) item μίας γραμματικής ονομάζεται ο συνδυασμός

ενός LR(0) item της γραμματικής με ένα τερματικό σύμβολο ή το σύμβολο $, το οποίο μπορεί να ακολουθεί το δεξί μέλος του κανόνα, π.χ.:[Α= Χ, Υ, •,Ζ , α] όπου βέβαια α FOLLOW(Α).

• H προσθήκη του συμβόλου σαν δεύτερη συνιστώσα, επηρεάζει μόνο τα items της μορφής [A = X, • , α] διότι για να είναι δυνατή η ελάττωση κατά τον κανόνα Α=Χ πρέπει το επόμενο σύμβολο εισόδου να είναι το α.

• Ποιά είναι όμως η διαφορά από τα items LR(0) και τη χρήση τους με έναν πίνακα SLR(1) ;

• Με ποιό τρόπο μπορούμε να περιορίσουμε τα τερματικά σύμβολα για τα οποία έχουμε LR(1) items;

Page 37: ΣΑ από κάτω-προς-τα-πάνω

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

Έγκυρα LR(1) items• Το LR(1) item [Α= Χ, •, Υ , α] ονομάζεται έγκυρο (valid)

για το βιώσιμο πρόθεμα W, αν υπάρχει μία δεξιότερη παραγωγή:S B, A, C B, X, Y, Cόπου W=B, X και, είτε α FIRST(C), είτε ε FIRST(C) και το α είναι $ .

• Π.χ. για την γραμματική S = B, B ; B = “a”, B | “b” ;το item [Β= “a”, •, B , “a”] είναι έγκυρο για το πρόθεμα“aa” της συμβολοσειράς “aabab”, καθώς υπάρχει δεξιότερη παραγωγή S “a”, B, “ab” “aa”, B, “ab”

Page 38: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή ΝΠΑ για ΣΑ LR(1)• Η συνάρτηση Closure(I) για LR(1):

Closure(I) repeat for any item [A = Χ, •, Y, Z, a] in Ifor any production Y = •, W and any terminalb FIRST(Z,a) I = I { [Y = •, W ,b] }until I does not changereturn I

• Τι διαφορετικό προσφέρει η closure στη μορφή αυτή σε σχέση με την αντίστοιχη συνάρτηση του ΣΑ SLR(1)/LR(0) ;

Page 39: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή ΝΠΑ για ΣΑ LR(1) (συνέχεια)• Goto(I, X)

let J = for all items [A = Y, •, X, Z , a] in I

J = J {[A = Y, X, •, Z, a] }return closure(J)

• Items(G’)Let T = Closure( [S’= •, S ,$] )repeat for each state I in T

for each item [A = a, •, X, b ,c] in I T = T Goto(I, X)

until T don’t change

Page 40: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα κατασ. ΝΠΑ αναλυτή LR(1)• Έστω η γραμματική

S’S ;S C, C ;C = “c”, C | “d” ;

closure( [S’•,S ,$] ) = [S’•,S ,$] [S = •,C, C ,$] *[C = •,“c”, C , “c”] [C = •,“c”, C , “d”] **[C = •,“d”, “c”] [C = •,“d”, “d”]

* αν αντικαταστήσουμε όπου Α=S’, Χ=ε, Υ=S, Z=ε και α=$ καθώς FIRST($) = $

** αν αντικαταστήσουμε όπου Α=S, Χ=ε, Υ=C, Z=C και α=$ καθώς FIRST(C,$) = {“c”, “d”}

Page 41: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα αναλυτή LR(1) (συνέχ.)

S ' = . , S ,$S = . , C , C ,$C = . , "c", C ,"c"/"d"C = . , "d " ,"c"/"d"

"c"S = C , . , C ,$C = ., "c", C ,$C = ., "d " ,$

S ' = S , . ,$

C = c, . , C ,"c"/"d"C = ., "c", C ,"c"/"d"C = ., "d " ,"c"/"d"

C = c, C , . ,"c"/"d"

C = "d", . ,"c"/"d"

C = c, . , C ,$C = ., "c", C ,$C = ., "d " ,$

1 2

6

4

5

3

7

9

8

C

C

C"c"

"c"

"d"

S

"d"

C = "d", . ,$

S = C , C , . ,$

C

7C = c, C , . ,$

"c"

"d"

10

"d"

Page 42: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή πινάκων action, goto1. Για κάθε Χ-μετάβαση ΙJ, όπου

Χ είναι τερματικό θέσε action[I, X] = shift J. Aν το Χ είναι μη-τερματικό τότε goto[I,X]=J.

2. Aν μία κατάσταση Ι περιέχει το item [S’=S, •, $] τότε action[I,$]=accept.

3. Aν μία κατάσταση Ι περιέχει το item [Α = X, • , a] τότε action[I, a] = reduce A=X

4. Kάθε κενό κελί των πινάκων action και goto ισοδυναμεί με σφάλμα.

State c d $ S C1 s5 s8 4 22 s3 s10 63 s3 s10 74 acc5 s5 s8 96 r17 r28 r3 r39 r2 r210 r3

action goto

Πίνακας ΣΑ για το προηγούμενο παράδειγμα

Page 43: ΣΑ από κάτω-προς-τα-πάνω

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

Συντακτική ανάλυση LALR(1)• Για μία γλώσσα σαν την Pascal, ένας ΣΑ SLR

κατασκευάζει ένα πίνακα μερικών εκατοντάδων γραμμών.Αντίστοιχα, ένας ΣΑ LR(1) κατασκευάζει πίνακα μερικών χιλιάδων γραμμών.

• LALR (lookahead LR) : περιορισμένες συγκρούσεις σε σχέση με τον SLR, διατηρώντας ταυτόχρονα ένα αναλόγου μεγέθους πίνακα με αυτόν.

Page 44: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή LALR• Κατά την κατασκευή του ΝΠΑ για την αναγνώριση των

βιώσιμων προθεμάτων ενός LR(1) παρατηρούνται καταστάσεις που έχουν το ίδιο πυρήνα (core), δηλ. αποτελούνται από τα ίδια LR(0) items και διαφέρουν μόνο στο προβλεπόμενο (lookahead) σύμβολο. Π.χ.

"c"C = c, . , C ,"c"/"d"C = ., "c", C ,"c"/"d"C = ., "d " ,"c"/"d"

C = c, C , . ,"c"/"d"

C = "d", . ,"c"/"d"C = c, . , C ,$C = ., "c", C ,$C = ., "d" ,$

5 3

79

8

C C"c"

C = "d", . ,$C = c, C , . ,$

10

"d"

Page 45: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή LALR (συνέχεια)• Η κατασκευή του LALR βασίζεται στην ενοποίηση των

καταστάσεων του αναλυτή LR(1) που έχουν τον ίδιο πυρήνα.

• Η ενοποίηση αυτή δεν μπορεί να προκαλέσει τη δημιουργία συγκρούσεων ολίσθησης-ελάττωσης. Π.χ. αν στον LALR έχουμε τα items:[A=X,• ,a] και [Β=Υ,•,a,Z ,b]τότε στον αρχικό αναλυτή LR(1) θα είχαμε επίσης items της μορφής:[A=X,• ,a] και [Β=Υ,•,a,Z ,c]δεδομένου ότι η ενοποίηση πραγματοποιείται στην βάση των πυρήνων, δηλ. των LR(0) items. Άρα θα υπήρχε σύγκρουση και στον αρχικό αναλυτή.

Page 46: ΣΑ από κάτω-προς-τα-πάνω

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

Κατασκευή LALR (συνέχεια2)• Η ενοποίηση των καταστάσεων του αρχικού

LR(1) δεν δημιουργεί πρόβλημα στις μεταβάσεις των νέων καταστάσεων. Έστω, μία νέα κατάσταση J=I1 … In .Καθώς τα I1,…, In έχουν τον ίδιο πυρήνα, οι μεταβάσεις από αυτά με κάποια σύμβολο Χ οδηγεί σε καταστάσεις goto(Ι1,X), …, goto(In,X) που έχουν και αυτές τον ίδιο πυρήνα. Άρα κατά την ενοποίηση των καταστάσεων θα ενοποιηθούν και αυτές.

• To συμπλήρωμα των πινάκων action & goto γίνεται με τον ίδιο ακριβώς τρόπο.

Page 47: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα LR(1) - LALR

State c d $ S C1 s35 s810 4 22 s35 s810 64 acc35 s35 s810 796 r179 r2 r2 r2

810 r3 r3 r3

action goto

S ' = . , S ,$S = . , C , C ,$C = . , "c", C ,"c"/"d"C = . , "d" ,"c"/"d"

S = C , . , C ,$C = ., "c", C ,$C = ., "d" ,$

S ' = S , . ,$

C = c, . , C ,$ /"c"/"d"C = ., "c", C ,$ /"c"/"d "C = ., "d " ,$ /"c"/"d"

C = c, C , . ,$ /"c"/"d "

C = "d", . ,$ /"c"/"d"

1

2

6

4

35

79

810

C

C

"c"

"c"

"d"

"d"

S = C , C , . ,$

C"c"

"d"

S

Page 48: ΣΑ από κάτω-προς-τα-πάνω

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

Κατηγοριοποίηση των γραμματικών

LR(0)

LL(1)SLR

LALR(1)LR(1)

Page 49: ΣΑ από κάτω-προς-τα-πάνω

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

Xρησιμοποιώντας ασαφείς γραμματικές• Οι ασαφείς γραμματικές προσφέρουν ένα εύκολο και

σύντομο τρόπο για την περιγραφή προγραμματιστικών δομών.

• Π.χ. Ε = Ε, “+”, Ε | Ε, “*”, Ε | “(”, Ε, “)” | id ;Μία μη-διφορούμενη γραμματική που γεννά την ίδια γλώσσα είναι:Ε = Ε, “+”, Τ | T ;Τ = Τ, “*”, F | F ;F = “(”, E, “)” | id ;Xαρακτηριστικά: + χαμηλότερη προτεραιότητα από *

Page 50: ΣΑ από κάτω-προς-τα-πάνω

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

Άρση της ασάφειας κατά την ΣΑ• Χρήση κανόνων άρσης της ασάφειας:

1. Στην περίπτωση μίας σύγκρουσης ολίσθησης/ ελάττωσης, κάνουμε ολίσθηση.2. Στην περίπτωση μίας σύγκρουσης ελάττωσης/ ελάττωσης εφαρμόζουμε τον κανόνα με την μεγαλύτερη προτεραιότητα.

• Συσχέτιση & προτεραιότητα τελεστών (associativity & precedence) για επίλυση συγκρούσεων ολίσθησης/ελάττωσης. Π.χ.Associativity: …+ id +… left-associativity…= id = … right-associativity

Page 51: ΣΑ από κάτω-προς-τα-πάνω

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

Άρση ασάφειας στο YACC• Για κάθε τερματικό και κανόνα αντιστοιχεί ένας

βαθμός προτεραιότητας και κάποια συσχέτιση:– %left TOKEN– %right TOKEN

• H προτεραιότητα αυξάνεται από πάνω προς τα κάτω.

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

Page 52: ΣΑ από κάτω-προς-τα-πάνω

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

Αποφυγή συγκρ. ολίσθησης-ελάττωσηςdef: param_spec return_spec ',‘ ;

param_spec: type | name_list ':' type ;

return_spec: type | name ':' type ;

type: ID ;

name: ID ;

name_list: name | name ',' name_list ;

Page 53: ΣΑ από κάτω-προς-τα-πάνω

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

Αποφυγή συγκρ. ολίσθησης-ελάττωσης (2)• Εισάγοντας εναλλακτικούς κανόνες που δεν

πρόκειται να ελαττωθούν ποτέ, αναγκάζουμε το YACC να μην οδηγήσει σε ενοποίηση καταστάσεων του αυτόματου για το ΣΑ LR(1). Π.χ.:%token BOGUS%%return_spec: type

| name ':' type| ID BOGUS ;

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

Page 54: ΣΑ από κάτω-προς-τα-πάνω

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

Χρήση αναδρομικών κανόνων• Η χρήση της προσέγγισης LALR από το YACC

εξασφαλίζει τη δυνατότητα χρήσης αναδρομικών κανόνων.

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

Δεξιά αναδρομή

list = elem, list |

elem;

Αριστερή αναδρομή

list = list, elem |

elem;

Page 55: ΣΑ από κάτω-προς-τα-πάνω

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

Ανάνηψη από λάθη στους αναλυτές LR• Οι αναλυτές SLR και LALR είναι δυνατό να κάνουν

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

• Οι αναλυτές LR δεν κάνουν ούτε μία ελάττωση πριν εντοπίσουν ένα λάθος. Τα λάθη εντοπίζονται μόνο από τον πίνακα action και όχι από τον goto.

• Ανάνηψη σε λειτουργία πανικού: αναζητούμε στη στοίβα μία κατάσταση s με μετάβαση για ένα συγκεκριμένο μη-τερματικό Α, αφαιρώντας ταυτόχρονα τις καταστάσεις που ακολουθούν. Αφαιρούμε από τη συμβολοσειρά εισόδου όλα τα σύμβολα μέχρι να εντοπίσουμε ένα το οποίο μπορεί να ακολουθεί το Α. Εισάγουμε στη στοίβα την κατάσταση goto[s, A] και συνεχίζουμε την ανάλυση.

Page 56: ΣΑ από κάτω-προς-τα-πάνω

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

Ανάνηψη από λάθη στο YACC• Στο YACC η ανάνηψη επιτυγχάνεται με τη βοήθεια

μίας μορφής παραγωγών λάθους (error productions). Π.χ.:smt : error ‘;’ ;

• Οι κανόνες που περιέχουν τη λέξη error προσδιορίζουν τα μη-τερματικά με τα οποία επιχειρεί να κάνει συγχρονισμό ο YACC σε περίπτωση λάθους. Συγκεκριμένα, ο YACC αφαιρεί από τη στοίβα σύμβολα μέχρι να βρει μη-τερματικό το οποίο να έχει ανάλογη παραγωγή. Τότε εισάγει το σύμβολο error στη στοίβα και επιχειρεί να «ταιριάξει» τον αντίστοιχο κανόνα αφαιρώντας αν χρειαστεί σύμβολα εισόδου.

Page 57: ΣΑ από κάτω-προς-τα-πάνω

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

Ανάνηψη από λάθη στο YACC (συν.)• Η λέξη error μπορεί να περιέχεται σε οποιοδήποτε

σημείο ενός κανόνα.• Στο κανόνα όπου τοποθετείται, διαχωρίζει ότι έχει

ήδη ανιχνευθεί (και άρα είναι στη στοίβα) και ότι θα αφαιρέσει ο ΣΑ από την είσοδο για να είναι δυνατή η ανάνηψη.

• Η εμφάνιση μηνυμάτων λάθους επιτυγχάνεται με την βοήθεια:– της συνάρτησης yyerror(char *) που ορίζει ο

χρήστης– των σημασιολογικών ενεργειών που

συνοδεύουν τον κανόνα.

Page 58: ΣΑ από κάτω-προς-τα-πάνω

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

Έλεγχος σφαλμάτων στο YACC• Ο έλεγχος της λειτουργίας του ΣΑ μπορεί να

επιτευχθεί με τη χρήση του διακόπτη:-DYYDEBUG=1κατά τη μεταγλώττιση του ΣΑ που έχει δημιουργήσει ο YACC.

• H τοποθέτηση οποιασδήποτε μη μηδενικής τιμής στη μεταβλητή yydebug (π.χ. πριν την κλήση της yyparse από τη main) προκαλεί την έξοδο μηνυμάτων όπως– Τι λεκτικές μονάδες επιστρέφει ο ΛΑ– Τι καταστάσεις περιέχει η στοίβα του ΣΑ

στη τυπική έξοδο λάθους (stderr).

Page 59: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα LR(1) - LALR• (Aho 4.40) Αποδείξτε ότιη γραμματική

S = A, “a” | “b”, A, “c” | B, “c” | “b”, B, “a”;A = “d”;B = “d”;

είναι LR(1) αλλά όχι LALR(1).Λύση

Επαύξηση της γραμματικής:(1) S’ = S ; (5) S = “b”, B, “a” ;(2) S = A, “a” ; (6) A = “d” ;(3) S = “b”, A, “c” ; (7) B = “d” ;(4) S = B, “c” ;

Kατασκευή του αυτόματου :

Page 60: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα LR(1) - LALR (συνέχεια)

S ' = . , S ,$S = . , A , a ,$S = . , b , A , c ,$S = . , B , c ,$S = . , b , B , a ,$A = . , "d" ,aB = . , "d" ,c

S = A , . , a ,$

S ' = S , . ,$

S = b , . , A , c ,$S = b , . , B , a ,$A = . , d ,cB = . , d ,a

A = d , . ,aB = d , . ,c

12

4

11

6

3

12

A

d

b

S

d

S = B , . , c ,$

S = A , a , . ,$a

B5

S = A , a , . ,$c

A = d , . ,aB = d , . ,c

13

S = b , A , ., c ,$7

9

8

S = b , B , ., a ,$

S = b , A , c, . ,$c

10

S = b , B , a , . ,$a

A

B

Page 61: ΣΑ από κάτω-προς-τα-πάνω

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

Παράδειγμα LR(1) - LALR (συνέχεια 2)• Συντακτικός πίνακας:

• Κατά την μετατροπή σε LALR γίνεται ένωση των καταστάσεων 12 και 13 που μοιράζονται τον πυρήνα Α = “d”, •B = “d”, •

State a b c d $ S A B1 s6 s12 11 2 42 s33 r24 s55 r46 s13 7 97 s88 r39 s1010 r511 acc12 r6 r713 r6 r7

action goto

H νέα κατάσταση που προκύπτει έχει σύγκρουση ελάττωσης-ελάττωσης για το σύμβολο εισόδου “c”.