Σχεδίαση Γλωσσών Προγραμματισμού Συντακτική Ανάλυση IV Εαρινό Εξάμηνο 2018 2019 Lec 12 01/04/2019 Διδάσκων: Γεώργιος Χρ. Μακρής
Καθοδική Ανάλυση Ξεκινά από τη αρχή της γραμματικής (ρίζα δένδρου) για να αναπτύξει τη συμβολοσειρά, που αναλύει, αν αυτή αποτελεί πρόταση. Καμία από τις τεχνικές που θα εξετάσουμε δεν μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές. Διακρίνουμε της τεχνικές της οπισθοδρόμησης και τις τεχνικές της πρόγνωσης.
Καθοδική ανάλυση με οπισθοδρόμηση Ι 1. Δοθέντος συγκεκριμένου μη τερματικού συμβόλου εφαρμόζεται ο πρώτος κανόνας της γραμματικής. 2. Στην προτασιακή μορφή, που προκύπτει επιλέγεται το πρώτο από αριστερά μη τερματικό σύμβολο και εφαρμόζεται ο πρώτος κανόνας, που αναφέρεται σε αυτό. 3. Γίνεται επαναληπτική εφαρμογή του βήματος 2, για κάθε ένα από τα μη τερματικά σύμβολα, που ακολουθούν, μέχρι τη στιγμή της παραγωγής, μιας σειράς τερματικών συμβόλων (πρόταση γλώσσας αν ταυτίζεται) ή τμήματος τερματικών συμβόλων της προτασιακής μορφής, που διαφέρει από το αντίστοιχο τμήμα της συμβολοσειράς εισόδου Η δεύτερη περίπτωση μπορεί να είναι αποτέλεσμα εσφαλμένης επιλογής κανόνα. Αναιρείται ο κανόνας που εφαρμόσθηκε τελευταίος και χρησιμοποιείται ο επόμενος που ισχύει για το ίδιο μη τερματικό σύμβολο. Αν έχουν χρησιμοποιηθεί όλοι οι κανόνες, τότε ο αλγόριθμος διατηρεί το σύμβολο ως έχει και προχωρά στην αναίρεση του κανόνα για το προηγούμενο μη τερματικό σύμβολο και οπισθοδρομεί στην κατάλληλη θέση της συμβολοσειράς εισόδου.
Παράδειγμα ανάγκης καθοδικής ανάλυσης με οπισθοδρόμηση Γραμματική L: ΕΝΤΟΛΗ ΕΝΤΟΛΗ-Α ΕΝΤΟΛΗ-Β ΕΝΤΟΛΗ-Α if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ-Α else ΕΝΤΟΛΗ-Α άλλη εντολή ΕΝΤΟΛΗ-Β if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ-Α else ΕΝΤΟΛΗ-Β 4
Παράδειγμα Καθοδικής ανάλυσης με οπισθοδρόμηση ΠΑΡΑΔΕΙΓΜΑ S kxn ky S S S X l m Y m m n n n m k X n k X n Συμβολοσειρά προς αναγνώριση: kmmm (α) (β) (γ) S S S l k X n k m Y k Y m m (δ) (ε) (ζ) m 5
Καθοδική ανάλυση με οπισθοδρόμηση ΙΙI Ιδιαίτερα πολύπλοκη Όχι αποδοτική Αρκετά γενική, δηλ. αναγνωρίζει πιο πολλές γλώσσες από τις άλλες τεχνικές καθοδικής ανάλυσης Αργεί στον εντοπισμό των λαθών και έτσι η ανάνηψη γίνεται πολύ δύσκολη
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Ι Στην ανάλυση αναδρομικής κατάβασης ο κάθε κανόνας, που αναφέρεται σε κάποιο μη τερματικό σύμβολο, εκφράζεται από τον ορισμό μιας διαδικασίας, που θα το αναγνωρίζει. Ένας αναλυτής προβλέπουσας αναδρομικής κατάβασης αποτελείται: από μία καθολική μεταβλητή, που περιέχει την τιμή της τρέχουσας λεξικής μονάδας από μία βοηθητική διαδικασία αναγνώρισης, που ελέγχει αν η τρέχουσα λεξική μονάδα είναι η αναμενόμενη και καλεί τη διαδικασία λεξικής ανάλυσης, για την ανάγνωση της επόμενης λεξικής μονάδας και την ενημέρωση της καθολικής μεταβλητής από τις διαδικασίες ανάλυσης, που αντιστοιχούν στα μη τερματικά σύμβολα της γραμματικής από μια διαδικασία εκκίνησης, που αφού διαβάσει την πρώτη λεξική μονάδα καλεί τη διαδικασία, που αντιστοιχεί στο μη τερματικό σύμβολο της αρχής.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙ ΠΑΡΑΔΕΙΓΜΑ S=έκφραση. έκφραση = έκφραση + όρος έκφραση όρος όρος. όρος = όρος * παράγοντας όρος / παράγοντας παράγοντας. παράγοντας = ( έκφραση ) αριθμός. παράγοντας: Επέλεξε ΛΕΞ_ΜΟΝ περίπτωση ( : αναγνώρισε ( ( ); έκφραση; αναγνώρισε ( ) ); περίπτωση αριθμός : αναγνώρισε( αριθμός ); αλλιώς: λάθος; Τέλος παράγοντα. //αν_λεξ_μον: αναμενόμενη λεξ. μονάδα αναγνώρισε (αν_λεξ_μον): αν (ΛΕΞ_ΜΟΝ=αν_λεξ_μον) τότε διάβασε την επόμενη μονάδα και ενημέρωσε τη μεταβλητή ΛΕΞ_ΜΟΝ; αλλιώς λάθος; τέλος αν Τέλος αναγνώρισε.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙI Η προβλέπουσα αναδρομική κατάβαση στηρίζεται στην πρόγνωση του κατάλληλου κάθε φορά κανόνα, που οδηγεί στην παραγωγή του δένδρου της πρότασης. Δε μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές, όπως αυτή του προηγούμενου παραδείγματος. Ας θεωρήσουμε τη μη αριστερά αναδρομική γραμματική των αριθμητικών εκφράσεων: S=έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι - όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙV Για το μη τερματικό σύμβολο «έκφραση», μπορεί εναλλακτικά να έχουμε την παραγωγή, έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι (έκφραση) υπ_παραγ υπ_όροι... ή την παραγωγή έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι αριθμός υπ_παραγ υπ_όροι.... Γενικά, για να στηριχθεί η ανάλυση στην τεχνική της πρόγνωσης χρειάζεται για κάθε μη τερματικό σύμβολο, να είναι εκ των προτέρων γνωστό τo σύνολο των τερματικών, που είναι δυνατό να εμφανισθούν στην αρχή των συμβολοσειρών, που παράγονται από αυτό (σύνολο FIRST). Επιπλέον, αν η γραμματική περιλαμβάνει κανόνες ε, τότε για κάθε μη τερματικό σύμβολο που βρίσκεται στο αριστερό μέρος ενός τέτοιου κανόνα, επιβάλλεται και ο υπολογισμός του συνόλου των τερματικών, που μπορεί να εμφανισθούν αμέσως μετά από αυτό (σύνολο FOLLOW).
Ανάλυση προβλέπουσας αναδρομικής κατάβασης V Ανάλυση πρόγνωσης: κεντρική ιδέα Δοθείσης μιας παραγωγής A, ο αναλυτής πρέπει να είναι σε θέση να επιλέξει μεταξύ & Σύνολα FIRST Για ένα δεξί μέρος παραγωγής G, ορίζουμε ως FIRST( ) το σύνολο των αναγνωριστικών που εμφανίζονται πρώτα στις συμβολοσειρές που παράγονται από το. Δηλαδή ισχύει, x FIRST( ) αν και μόνο αν * x, για κάποια συμβολοσειρά Γραμματική LL(1) Αν A και A εμφανίζονται στη γραμματική πρέπει FIRST( ) FIRST( ) = Αυτό επιτρέπει στον αναλυτή να προγνώσει με ασφάλεια την παραγωγή που θα χρησιμοποιεί σε κάθε βήμα!
Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙ Δοθείσης μιας γραμματικής που έχει την ιδιότητα LL(1) μπορούμε να γράψουμε διαδικασίες που να αναγνωρίζουν το αριστερό μέρος της κάθε παραγωγής ο κώδικας της ανάλυσης είναι απλός και γρήγορος Οι γραμματικές με την ιδιότητα LL(1) ονομάζονται προγνώσιμες γραμματικές γιατί ο αναλυτής μπορεί να «προγνώσει» τη σωστή ανάπτυξη σε κάθε σημείο της ανάλυσης. Οι αναλυτές που εκμεταλλεύονται την ιδιότητα LL(1) ονομάζονται αναλυτές πρόγνωσης. Μία περίπτωση ανάλυσης πρόγνωσης είναι η ανάλυση προβλέπουσας αναδρομικής κατάβασης.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙI Παράδειγμα διορθωμένης γραμματικής αριθμητικών εκφράσεων (βλ. διαφάνεια Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙΙ) int PLUS=1, MINUS=2,... int lookahead = getnexttoken(); //καθολική μετβλητή ΛΕΞ_ΜΟΝ void advance() { lookahead = getnexttoken(); } void match(int token) { if (lookahead == token) advance(); else error(); } void Term() { Factor(); TermPrime(); } void S() { Expr(); } void Expr() { Term(); ExprPrime(); } void ExprPrime() { switch(lookahead) { case PLUS : match(plus); Term(); ExprPrime(); break; case MINUS : match(minus); Term(); ExprPrime(); break; default: return; } } void TermPrime() { switch(lookahead) { case TIMES: match(times); Factor(); TermPrime(); break; case DIV: match(div); Factor(); TermPrime(); break; default: return;} } void Factor() { switch(lookahead) { case LPAR : match(lpar); Expr(); match(rpar); break; case NUMBER: match(number); break; default: error();} }
Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙII Παράδειγμα διορθωμένης γραμματικής αριθμητικών εκφράσεων (βλ. διαφάνεια Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙΙ) Για την κατασκευή παράγωγου δένδρου: Γράφουμε μέσα στις διαδικασίες κώδικα για δημιουργία κόμβου Περνάμε τους κόμβους από διαδικασία σε διαδικασία μέσω μιας στοίβας Αφαιρούμε από τη στοίβα τους κόμβους του δεξιού μέρους της παραγωγής, τους κάνουμε απογόνους του κόμβου του αριστερού μέρους και εισάγουμε τον τελευταίο στη στοίβα Για την κατασκευή συντακτικού δένδρου Κατασκευάζουμε λιγότερους κόμβους Χρειάζεται να τους βάζουμε στη στοίβα με την κατάλληλη σειρά ώστε να εξασφαλίζουμε αριστερή προσεταιριστικότητα Expr() { Term(); ExprPrime(); /* δημιουργία κόμβου Expr; εξαγωγή κόμβου ExprPrime από στοίβα; εξαγωγή κόμβου Term από στοίβα; καθιστούμε ExprPrime και Term απογόνους του Expr; εισαγωγή κόμβου Expr στη στοίβα; */ }
Ανάλυση προβλέπουσας αναδρομικής κατάβασης IΧ Άλλο παράδειγμα S = if E then S else S begin S L print E. L = end ; S L. E = num = num void S() { void L() { switch(lookahead) { switch(lookahead) { case IF: match(if); E(); match(then); S(); case END: match(end); break; match(else); S(); break; case SEMI: match(semi); S(); case BEGIN: matvh(begin); S(); L(); break; L(); break; case PRINT: match(print); E(); break; default: error(); default: error(); } } } } void E() { match(num); match(eq); match(num); }
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Χ main: κλήση S(); S 1 : εφαρμογή της παραγωγής (S, IF) : S if E then S else S S 1 : match(if); S 1 : κλήση E(); E 1 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 1 : match(num); match(eq); match(num); E 1 : return για E 1 στο S 1 S 1 : match(then); S 1 :κλήση S(); S 2 : εφαρμογή της παραγωγής για (S, PRINT): S print E S 2 : match(print); S 2 : κλήση E(); E 2 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 2 : match(num); match(eq); match(num); E 2 : return για E 2 στο S 2 S 2 : return για S 2 στο S 1 S 1 : match(else); S 1 : κλήση S(); S 3 : εφαρμογή της παραγωγής για (S, PRINT): S print E S 3 : match(print); S 3 : κλήση E(); E 3 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 3 : match(num); match(eq); match(num); E 3 : return για E 2 στο S 3 S 3 : return για S 3 στο S 1 S 1 : return για S 1 στο main main: match(eof); return success; Άλλο παράδειγμα (συνέχεια) πρόταση: if 2=2 then print 5=5 else print 1=1
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙ Γενική μορφή διαδικασιών προβλέπουσας αναδρομικής κατάβασης Αν για το μη τερματικό σύμβολο Χ ορίζεται στη γραμματική ο κανόνας X p1 p2... και αν υποθέσουμε ότι η pείναι i απαλείψιμη, τότε Χ: Επέλεξε ΛΕΞ_ΜΟΝ περιπτώσεις FIRST( p 1 ): διαδικασίες αναγνώρισης p 1 περιπτώσεις FIRST( p 2 ): διαδικασίες αναγνώρισης p 2... περιπτώσεις FIRST( p i ) FOLLOW(X): p i διαδικασίες αναγνώρισης ή των συμβόλων που ακολουθούν αλλιώς λάθος; Τέλος Χ.
Recursive descent με σύνολα FIRST & Follow
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙΙ Δεν μπορούν να χρησιμοποιηθούν αριστερά αναδρομικές γραμματικές. Δεν μπορούν να χρησιμοποιηθούν γραμματικές, που δεν είναι LL(1), όπως π.χ.: σειρά_εντολών = εντολή ; σειρά_εντολών εντολή. εντολή = τερματικό.
Ανάλυση LL(1) I Συμβολοσειρά εισόδου κεφαλή ανάγνωσης Πίνακας ανάλυσης M[X, α] Αλγόριθμος X Y "k" στοίβα (σύμβολα που εκκρεμεί η αναγνώρισή τους)
Ανάλυση LL(1) II Αλγόριθμος υπολογισμού πίνακα ανάλυσης Μ
Ανάλυση LL(1) IIΙ ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων) S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι - όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός. M αριθμός + - * / ( ) $ έκφραση όρος υπ_όροι όρος υπ_όροι υπ_όροι + όρος υπ_όροι - όρος υπ_όροι ε ε όρος παράγοντας υπ_παραγ παράγοντας υπ_παραγ υπ_παραγ ε ε * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε ε παράγοντας αριθμός ( έκφραση )
Ανάλυση LL(1) IV ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων συνέχεια) LL(1) ανάλυση της συμβολοσειράς εισόδου 27-5*8 ΣΤΟΙΒΑ ΣΥΜΒΟΛ. ΠΑΡΑΓΩΓΗ $ έκφραση 27-5*8$ $ υπ_όροι όρος 27-5*8$ έκφραση = όρος υπ_όροι. $ υπ_όροι υπ_παραγ. παράγοντας 27-5*8$ όρος = παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. αριθμός 27-5*8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. -5*8$ $ υπ_όροι -5*8$ υπ_παραγ. = ε. $ υπ_όροι όρος - -5*8$ υπ_όροι = - όρος υπ_όροι. $ υπ_όροι όρος 5*8$ $ υπ_όροι υπ_παραγ. παράγοντας 5*8$ όρος = παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. αριθμός 5*8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. *8$ $ υπ_όροι υπ_παραγ. παράγοντας * *8$ υπ_παραγ. = * παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. παράγοντας 8$ $ υπ_όροι υπ_παραγ. αριθμός 8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. $ $ υπ_όροι $ υπ_παραγ. = ε. $ $ υπ_όροι. = ε.
Ανάλυση LL(1) V Αλγόριθμος ανάλυσης LL(1) push($); // $ είναι το σύμβολο τέλους της συμβολοσειράς push(s); // S είναι η αρχή της γραμματικής lookahead = get_next_token(); // διάβασε το επόμενο αναγνωριστικό repeat X = top_of_stack(); if (X είναι τερματικό ή X == $) then if (X = = lookahead) then pop(x); lookahead = get_next_token(); else error(); else // X ένα μη τερματικό if ( M[X, lookahead] = = X Y 1 Y 2... Y k ) then pop(x); push(y k ); push(y k-1 );... push(y 1 ); else error(); until (X = $)
Αριστερή Αναδρομικότητα (left recursion) Ένας κανόνας είναι αριστερά αναδρομικός όταν το πρώτο σύμβολο που εμφανίζεται στο δεξί σκέλος είναι το μη τερματικό που εμφανίζεται και αριστερά π.χ. Α Αcd είναι αριστερά αναδρομικός Α c Αd δεν είναι αριστερά αναδρομικός Αντίστοιχη ρουτίνα αναδρομικού κανόνα: procedure A ; begin Α ; κάλεσμα της Α getoken(c) ; getoken(d) ; end ; 25
Εξάλειψη Αριστερής Αναδρομικότητας Τέχνασμα εξάλειψης Από: Α Αα β σε : Α βα' Α' αα' ε Γραμματική: Ε Ε + T Τ Τ Τ*F F F <id> ε Μετά την εξάλειψη έχουμε : Ε ΤΕ Ε + Τ Ε ε Τ FT T *F T ε F <id> ε 26
Απομάκρυνση αριστερής αναδρομικότητας Ι Διακρίνουμε την άμεση και την έμμεση αριστερή αναδρομικότητα ΠΑΡΑΔΕΙΓΜΑ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: έκφραση = έκφραση ΤΛ_ΑΘ όρος όρος. ΠΑΡΑΔΕΙΓΜΑ ΕΜΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: X Yp 2... Y Xp 1... ΓΕΝΙΚΗ ΜΟΡΦΗ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: X Xp1 Xp2... Xpn q1 q2... q m μετασχηματίζεται στην ισοδύναμη μορφή X X q1 X ' q2 X '... qm X '. ' 2 p1 X ' p X '... pn X '.
Απομάκρυνση αριστερής αναδρομικότητας ΙΙ ΠΑΡΑΔΕΙΓΜΑ Η S = έκφραση. έκφραση = έκφραση + όρος έκφραση όρος όρος. όρος = όρος * παράγοντας όρος / παράγοντας παράγοντας. παράγοντας = ( έκφραση ) αριθμός. μετασχηματίστηκε στην S=έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός.
Απομάκρυνση αριστερής αναδρομικότητας ΙΙΙ Αλγόριθμος απομάκρυνσης άμεσης και έμμεσης αριστερής αναδρομικότητας Είσοδος: Μία γραμματική G χωρίς κυκλικούς κανόνες παραγωγής και κανόνες-ε Έξοδος: Μία ισοδύναμη γραμματική χωρίς αριστερή αναδρομικότητα Περιγραφή: 1. Θεωρούμε τα μη τερματικά σύμβολα X 1, X 2,..., X n, με το δείκτη του καθενός να αντιστοιχεί στη σειρά με την οποία κάνει την εμφάνισή του ο αντίστοιχος κανόνας στη γραμματική. 2. Για (i:=1 μέχρι n) επανέλαβε Για (j:=1 μέχρι i-1) επανέλαβε αντικατέστησε κάθε κανόνα της μορφής X i X jq με τους κανόνες X i p1q p2q... pkq, για τις υπάρχουσες παραγωγές X j p1 p2... pk Τέλος επανάληψης απομάκρυνε την άμεση αριστερή αναδρομικότητα των κανόνων για το σύμβολο X i Τέλος επανάληψης
Απομάκρυνση αριστερής αναδρομικότητας ΙV Κατά την απομάκρυνση της αριστερής αναδρομικότητας δεν αλλάζει η γλώσσα της γραμματικής. Αλλάζει η μορφή των δένδρων που παράγει η επιλεγείσα μέθοδος ανάλυσης. Σημαντικότερη συνέπεια είναι το γεγονός ότι χάνεται η επιθυμητή ιδιότητα της αριστερής προσεταιριστικότητας.
Παραγοντοποίηση Σε γενική μορφή η παραγοντοποίηση συνίσταται στο να πάρουμε έναν κανόνα της μορφής: Α αβ 1 αβ 2 και να τον μετατρέψουμε σε: Α αβ Β β 1 β 2 Εφαρμόζοντας την παραγοντοποίηση, μετατρέπουμε τους κανόνεςέτσιώστεταπρώτατερματικάπουεμφανίζονταισε κάθε επιλογή του δεξιού σκέλους κάθε κανόνα να είναι όλα διαφορετικά μεταξύ τους. Ονομάζουμε αυτή την ιδιότητα ενός κανόνα «προβλεψιμότητα». 31
Παράδειγμα Παραγοντοποίησης E T E + T Τουλάχιστον ένα T πρέπει να υπάρχει ακολουθούμενο από τη συμβολοσειρά + T που μπορεί να επαναλαμβάνεται n φορές, όπου n = 0. Άρα μπορεί να παραγοντοποιηθεί και να γραφεί: E T ( + T )* (ή εναλλακτικά E T { + T } ) Το παραπάνω αποτελεί μια μορφή αριστερής αναδρομικότητας και λύνεται γενικά με την λεγόμενη «εξάλειψη αριστερής αναδρομικότητας». 32
Αριστερή παραγοντοποίηση Ι Προηγείται οποιασδήποτε προβλέπουσας ανάλυσης, αν για το ίδιο μη τερματικό σύνολο υπάρχουν δύο ή περισσότεροι κανόνες με το ίδιο πρόθεμα στο δεξί μέρος. ΠΑΡΑΔΕΙΓΜΑΤΑ σειρά_εντολών = εντολή ; σειρά_εντολών εντολή. εντολή = τερματικό. ή εντολή_if = if έκφραση then εντολή if έκφραση then εντολή else εντολή.
Αριστερή παραγοντοποίηση ΙΙ Γενικά, ο κανόνας X " y" p1 " y" p2. μετασχηματίζεται στον X " y" X '. X p 1 p. ' 2 Είσοδος: Μία γραμματική G Έξοδος: Μία ισοδύναμη γραμματική LL(1) Περιγραφή: Για (κάθε μη τερματικό σύμβολο X) επανέλαβε συμβολίζουμε με p το μεγαλύτερο κοινό πρόθεμα μεταξύ δύο ή περισσότερων εναλλακτικών περιπτώσεων παραγωγής του X αν ( p ) τότε Έστω X p1 p2... pn. όλες οι πιθανές παραγωγές για το μη τερματικό σύμβολο Χ και έστω ότι οι p 1, p2,..., pk μοιράζονται το κοινό πρόθεμα p, ώστε στις πιθανές παραγωγές X pq1 pq2... pqk pk 1... pn. τα q 1, q2,..., qk δε μοιράζονται κάποιο κοινό πρόθεμα, ενώ τα p k 1, p2,..., pn δε αρχίζουν από p. Αντικαθιστούμε κάθε τέτοιο κανόνα με δύο κανόνες της μορφής X px p k... p. τέλος αν Τέλος επανάληψης X ' q1... qk ' 1 n.
Αντικατάσταση Αντικαθιστούμε στο δεξί σκέλος ενός κανόνα παραγωγής ένα μη τερματικό Α με όλα τα εναλλακτικά μέλη κανόνων για το Α: Β a Α b A α 1 α 2 αn Μετασχηματίζεται σε: Β a α 1 b a α 2 b aαnb 35