Επαναληπτικό...

Preview:

Citation preview

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Επαναληπτικό ΜάθημαΠανεπιστήμιο Μακεδονίας

Τμήμα Εφαρμοσμένης Πληροφορικής

Ηλίας Σακελλαρίου

Γλώσσες Προγραμματισμού▪ Γλώσσα προγραμματισμού: Συμβολική

περιγραφή υπολογισμών (computations).• Προδιαγραφή, οργάνωση και συλλογιστική

υπολογισμών.▪ Πρόγραμμα = συμβολική περιγραφή ενός υπολογισμού

σε κάποια γλώσσα. ▪ Μια γλώσσα προγραμματισμού έχει σαν στόχο

• να επιτρέπει την εύκολη περιγραφή των υπολογισμών,

• να εκμεταλλεύεται αποδοτικά την υπολογιστική ισχύ των μηχανών.

Ευκολία προέχει της απόδοσης!

Φάσεις Μεταγλώττισης

Συντακτική Ανάλυση

Λεκτική Ανάλυση

Σημασιολογική Ανάλυση

Παραγωγή Ενδιάμεσου Κώδικα

Βελτιστοποίηση Ενδιάμεσου Κώδικα

Βελτιστοποίηση Τελικού Κώδικα

Παραγωγή Τελικού Κώδικα

Πίνακας Συμβόλων

Χειριστής Σφαλμάτων

Αρχικό Πρόγραμμα

λεκτικές μονάδες

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

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

ενδιάμεσος κώδικας

ενδιάμεσος κώδικας

τελικός κώδικας

Τελικό Πρόγραμμα

Λεκτική Ανάλυση

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

στην φάση της συντακτικής ανάλυσης.• Αποτελούν τερματικά σύμβολα της γλώσσας.

▪ Υλοποιείται από τον λεκτικό αναλυτή (lexical analyser, scanner) .• Αποθήκευση λεκτικών μονάδων στον πίνακα

συμβόλων. • Ανίχνευση σφαλμάτων• Διαγραφή σχολίων, διαστημάτων, κενών γραμμών.

Γραμματικές

▪ Πώς θα γίνει η περιγραφή των λεκτικών μονάδων και (αργότερα) της σύνταξης μιας γλώσσας;

▪ Γραμματικές: Σύστημα παραγωγής συμβολοσειρών G, που αποτελείται από μια τετράδα (T,N,P,S)• T τερματικά σύμβολα (terminals) που αποτελούν το

αλφάβητο της γλώσσας. • N μη-τερματικά σύμβολα (non-terminals)• P κανόνες παραγωγής (production rules) της

μορφής α → β, όπου α και β ∈ (Τ ∩ Ν)* • S αρχικό σύνολο, το οποίο είναι στοιχείο το Ν (start

symbol)

Ιεραρχία Chomsky

▪ Γραμματικές τύπου 0. ▪ Γραμματικές τύπου 1 (γραμματικές με

συμφραζόμενα – context sensitive grammars)▪ Γραμματικές τύπου 2 (γραμματικές χωρίς

συμφραζόμενα – context free grammars)▪ Γραμματικές τύπου 3 (κανονικές γραμματικές –

regular grammars)

Γραμματικές για Μεταγλωττιστές

▪ Γραμματικές τύπου 2 (γραμματικές χωρίς συμφραζόμενα – context free grammars)• Οι κανόνες παραγωγής έχουν μορφή α→β, όπου η

συμβολοσειρά α αποτελείται από ένα μη-τερματικό σύμβολο και η β είναι συμβολοσειρά.

▪ Γραμματικές τύπου 3 (κανονικές γραμματικές – regular grammars)• Οι κανόνες παραγωγής έχουν την μορφή

Α→aΒ Α→a Α→εA,B μη τερματικά και a τερματικό.

Αντιστοιχία Μοντέλων

Γεννητικά Μοντέλα Αναγνωριστικά Μοντέλα

Γραμματικές τύπου 0.

Αυτόματα Στοίβας

Κανονικές γραμματικές Πεπερασμένα Αυτόματα.

Μηχανή Turing

Γραμματικές με συμφραζόμενα

Γραμμικά Περιορισμένη Μηχανή Turing

Γραμματικές χωρίς συμφραζόμενα

Κανονικές Εκφράσεις

▪ Χρησιμοποιούνται για την περιγραφή κανονικών γλωσσών.• Κομψότερος και λακωνικότερος φορμαλισμός.

▪ Αντιστοιχία μεταξύ κανονικών εκφράσεων και κανονικής γραμματικής και πεπερασμένων αυτομάτων.

▪ Χρήση από εργαλεία κατασκευής λεκτικών αναλυτών.

Κανονικές Εκφράσεις

▪ Έστω ένα αλφάβητο Σ, μια κανονική έκφραση (KE) r ορίζει μια γλώσσα L(r) πάνω στο Σ.• Αναδρομικός ορισμός

▪ Κανονική έκφραση είναι • H κενή συμβολοσειρά L(ε)={ε} • Κάθε σύμβολο a του Σ L(a) = {a}• Η διάζευξη r|s L(r|s) = L(r)∪L(s)• H παράθεση rs L(rs)=L(r)L(s)• Το κλείσιμο Kleene r* L(r*)=L(r)*

▪ όπου τα r και s είναι κανονικές εκφράσεις.

Επέκταση Κανονικών Εκφράσεων

▪ Θετικό κλείσιμο Kleene r+ = rr*• Έκφραση εμφανίζεται μία η περισσότερες φορές

▪ Μηδέν ή μια εμφανίσεις της r r? = r|ε▪ Κλάσεις χαρακτήρων [a,b,c]=a|b|c▪ Διαστήματα χαρακτήρων [a-z]=a|b|...|z▪ Ειδικό σύμβολο για οποιονδήποτε χαρακτήρα

• Συνήθως είναι η τελεία▪ Ειδικοί χαρακτήρες παριστάνονται με το

σύμβολο \ να προηγείται. \) \( \[

Άσκηση● Περιγράψτε με κανονική έκφραση

συμβολοσειρές που ξεκινούν με το πρόθεμα "func" ή "endfunc" ακολουθούμενο το σύμβολο "-"και από ένα ή περισσότερα γράμματα πχ. func-double, func-computeString, func-a, endfunc-a

▪ Απάντηση: (func|endfunc)-([a-zA-Z])+

Πεπερασμένα Αυτόματα

▪ Αφηρημένες μηχανές που μπορούν να χρησιμοποιηθούν σαν “αναγνωριστές” σε κανονικές γλώσσες.• Ντετερμινιστικά Πεπερασμένα Αυτόματα (ΝΠΑ)• Μη-Ντετερμινιστικά Πεπερασμένα Αυτόματα (ΜΠΑ)• Μη-Ντετερμινιστικά Πεπερασμένα Αυτόματα με

μηδενικές Μεταβάσεις (ΜΠΑ-ε)▪ Όλα τα παραπάνω είναι ισοδύναμα από πλευράς

υπολογιστικής ικανότητας.

Διαγραμματική Αναπαράσταση(Γράφος Μετάβασης)

0 1

2

a

b

b

a

a b

3

b

a

▪ Συμβολοσειρές που αναγνωρίζει;• abb, aabb aaaabbbbb

▪ Κανονική Έκφραση • a+b+• aa*bb*

Παράδειγμα ΜΠΑ (i)

▪ Τι αναγνωρίζει το ακόλουθο αυτόματο;• abb• abababb• ababbaabbabaabb

0 1 2a

b

b

a

3b

Παράδειγμα ΜΠΑ-ε

1 2a

bb

a

0

5 6

a

ε b

8b

ε

7

3

4

ε

ε

▪ (aa|bb)(a|b)*b

Άσκηση

▪ Έστω συμβολοσειρές που αποτελούνται από 0 και 1, όπου κάθε 0 έχει πριν και μετά τουλάχιστον ένα 1. πχ. 11 101 101011 ενώ απορρίπτονται οι 110, 00 και 0010. • Να δοθεί το αντίστοιχο ντετερμινιστικό πεπερασμένο

αυτόματο• Η αντίστοιχη κανονική γραμματική • Η κανονική έκφραση

Απάντηση: ΝΠΑ

Α Β Γ1

1

1

0

Απάντηση: Γραμματική και Κανονική Έκφραση

▪ ΓραμματικήS::=1DD::=εD::=1DD::=01D

▪ Κανονική έκφραση 1(1|01)*

Άσκηση

▪ Έστω συμβολοσειρές με μήκος τουλάχιστον 2 που περιέχουν τουλάχιστον ένα 1, οι οποίες όταν ξεκινούν από 1 τότε η υπόλοιπη συμβολοσειρά πρέπει να έχει άρτιο αριθμό 1, ενώ όταν ξεκινούν από 0 η υπόλοιπη συμβολοσειρά πρέπει να έχει περιττό αριθμό 1, πχ 1011, 1010101110100 και 01, 0111, 0100010100. • Να δοθεί το αντίστοιχο ντετερμινιστικό πεπερασμένο

αυτόματο.

Απάντηση

Α DC

1

1

0

Β

0

1

1

0

0

Γραμματική και Κανονική Έκφραση

▪ Κανονική έκφραση: (0|10*1)0*1(0|10*1)*▪ Γραμματική:

S::=1BS::=0CB::=0BB::=1CC::=0CC::=1DD::=εD::=1CD::=0D

Αναγωγή Κανονικής Γραμματικής σε ΜΠΑ-ε

▪ Έστω μια γραμματική G=(T,N,P,S). Το αντίστοιχο ΜΠΑ-ε (Σ,Q,δ,F) θα έχει:• Σ = Τ, το αλφάβητο του ΜΠΑ-ε είναι το αλφάβητο της

γραμματικής• Q = Ν ∪ {qf}, οι καταστάσεις του ΜΠΑ-ε είναι τα μη-

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

• Για κάθε κανόνα Α →aΒ δ(Α,a)=BΑ →a δ(Α,a)=qf A→ε δ(Α,ε)=qf

• F = {qf}, τελική κατάσταση του αυτομάτου.

Παράδειγμα Αναγωγής σε ΜΠΑ-ε

▪ Έστω η γραμματική• Τ = {a,b}• N = {I,S,U}• P = {I → aS, S → bU U →ε

S → aS, S → bS U →b}• S = I

Ι Sa

a

b

bU

b

εqf

Αναγωγή ΚΕ σε ΜΠΑ-ε

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

▪ Στα επόμενα το Μ(r) είναι το ΜΠΑ-ε που αντιστοιχεί στην έκφραση r.

Αναγωγές (i)

▪ Κενή συμβολοσειρά ε παράγεται από το αυτόματο Μ(ε):

▪ Κανονική έκφραση που περιέχει ένα σύμβολο a του αλφαβήτου, από το αυτόματο Μ(a):

at qf

ε qf

Αναγωγές (ii)

▪ Συμβολοσειρά rs, όπου κάθε υποέκφραση παράγεται από τα αυτόματα Μ(r) και Μ(s) αντίστοιχα, παράγεται από το αυτόματο Μ(rs):

t2 qf2

εM(r)t1 qf1

M(s)

t2 qf2

M(r)t1

M(s)

Αναγωγές (iii)

▪ Συμβολοσειρά r|s, όπου κάθε υποέκφραση παράγεται από τα αυτόματα Μ(r) και Μ(s) αντίστοιχα, παράγεται από το αυτόματο Μ(r|s):

t2 qf2

εM(r)t1 qf1

M(s)

qft

εε

ε

Αναγωγές (iv)

▪ Συμβολοσειρά r*, όπου κάθε υποέκφραση παράγεται από τα αυτόματα Μ(r) και Μ(s) αντίστοιχα, παράγεται από το αυτόματο Μ(r*):

M(r)t1 qf1 qft

ε

ε

ε

Παράδειγμα

▪ Κανονική Έκφραση: (a|b)a(aa|bb)*

a

a a a

b bb ε

εε

ε ε

εε

ε

ε

ε

Συντακτική Ανάλυση

Συντακτικοί Αναλυτές (parsers)

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

▪ Ακόμα και με περιορισμούς εν λόγω γραμματικές καλύπτουν τις ανάγκες των περισσοτέρων γλωσσών προγραμματισμού.

▪ Οι από πάνω προς τα κάτω ΣΑ (top-down parers), ευκολότεροι στην κατασκευή και προγραμματίζονται χειρωνακτικά.

▪ Οι από κάτω προς τα πάνω (bottom-up parsers), καλύπτουν μια μεγαλύτερη κλάση γλωσσών και κατασκευάζονται συνήθως από αυτοματοποιημένα εργαλεία.

Παραγωγές στις Γραμματικές χωρίς Συμφραζόμενα (ΓΧΣ)

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

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

του αριστερότερου μη-τερματικού συμβόλου• Δεξιότερη παραγωγή: αντικατάσταση του

δεξιότερου μη-τερματικού συμβόλου.

Συντακτικό Δένδρο(syntax tree)

▪ Τρόπος αναπαράστασης μιας παραγωγής.▪ Το αρχικό μη-τερματικό σύμβολο τοποθετείται

στη ρίζα του δένδρου.▪ Κάθε "ενδιάμεσος" κόμβος του δένδρου

αναπαριστά ένα μη-τερματικό σύμβολο. ▪ Κάθε φύλλο του δένδρου αναπαριστά ένα

τερματικό σύμβολο.▪ Οι ακμές από ένα "ενδιάμεσο" κόμβο στους

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

Παράδειγμα (II.1)P={Stmt→ if ( Expr ) then StmtStmt→ while ( Expr ) StmtStmt→ id := id ;Stmt→ id := num ;Stmt→ begin StmtList endStmtList→ Stmt StmtList→ Stmt SmtList Expr→ id Op idExpr→ id Op numOp→ >Op→ <}

if (id > id) then id := id ;

Stmt

StmtthenExprif )(

id Op id id id:= ;

>

'Ασκηση● Έστω η γραμματική και η συμβολοσειρά αα+αα**

▪ S::= SS+ | SS* | a• Δώστε την αριστερότερη παραγωγή της

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

την συγκεκριμένη γραμματική.▪ Απάντηση

• S=>SS*=>SS+S*=>aS+S*=>aa+S*=>aa+SS**=>aa+aS**=>aa+aa**

• S=>SS*=>SSS**=>SSa**=>Saa**=>SS+aa**=>Sa+aa**=>aa+aa**

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

S

SS

SSS S

*

*+

a a a a

Διφορούμενες Γραμματικές▪ Όταν μια συμβολοσειρά μπορεί να αντιστοιχεί

σε δύο συντακτικά δένδρα για μια γραμματική τότε η γραμματική ονομάζεται διφορούμενη.

▪ Για παράδειγμα:E::=E"+"E | E"-"E| Ε"*"Ε | Ε"/"Ε | D D::="1"|"2"|"3""...|"9"|"0"

Συμβολοσειρά:1+2+3

Ε

Ε + E

D D

1

Ε

+ E

2

D

3

Ε

Ε + E

D D

2

Ε

+E

3

D

1

Άσκηση● Η παρακάτω γραμματική είναι διφορούμενη? Δώστε ένα παράδειγμα (δηλαδή μια συμβολοσειρά που αντιστοιχεί σε δύο συντακτικά δένδρα) που να αποδεικνύει το ισχυρισμό σας.

S::="a" S "b"B::="a" BB::=B "b"B::=ε

Απάντηση

▪ Ναι γιατί για παράδειγμα η συμβολοσειρά aabb έχει δύο συντακτικά δένδρα.

S

Ba

B

b

ε

B

a

b

S

Ba

B

b

ε

Ba

b

Τελεστές και Γραμματικές

▪ Πώς μπορεί να εκφραστεί η προτεραιότητα και προσεταιριστικότητα μέσω μιας μη-διφορούμενης γραμματικής;• Προτεραιότητα: Για κάθε ομάδα τελεστών ίσης

προτεραιότητας, δημιουργούμε ένα μη-τερματικό σύμβολο.

• Προσεταιριστικότητα: Για κάθε τελεστή ορίζεται κατάλληλα ο αντίστοιχος κανόνας παραγωγής.

Προσεταιριστικότητα

▪ Αριστερά προσεταιριστικός τελεστήςList ::= List "," Letter | LetterLetter ::= "a"|"b"|...|"z" Συμβολοσειρά a,b,c

▪ Δεξιά προσεταιριστικός τελεστήςΑssg ::= Letter "="Assg | LetterLetter ::= "a"|"b"|...|"z" Συμβολοσειρά a = b = c

List

List , Letter

Letter b

a

List

, Letter

c

Letter

Assg=Letter

Letterb

a

Assg

=

c

Assg

Παράδειγμα (i)

▪ Γραμματική:E::=E"+"E | E"-"E| Ε"*"Ε | Ε"/"Ε | D D::="1"|"2"|"3""...|"9"|"0"

▪ Δύο κατηγορίες τελεστών ως προς την προτεραιότητα:• αριστερά προσεταιριστικοί "+", "-"

▫ δημιουργία μη-τερματικού E• αριστερά προσεταιριστικοί "*" , "/"

▫ δημιουργία μη-τερματικού T. • το σύμβολο D παραμένει για να δηλώσει τις βασικές

μονάδες.

Παράδειγμα (ii)

▪ Αρ. προσεταιριστικοί "+", "-" (συμβ. Ε)

▪ Αρ. προσεταιριστικοί "*" , "/" (συμβ. Τ)

▪ το σύμβολο D

Συμβολοσειρά 4-3+5*8

▪ E::=E"+"T | E"-"T|T

▪ T::=T"*"D|T"/"D|D

▪ D::="1"|"2"|...|"9"|"0"

Ε

Ε - T

T D

Ε

+ Τ

3

D

8

Τ *

D

5D

4

Απαλοιφή Αριστερής Αναδρομής

▪ Αριστερά αναδρομικός κανόνας με:• Άμεση αναδρομή Α::= Αβ• Έμμεση αναδρομή Α::=αβ, όπου σε μία ή

περισσότερες παραγωγές η συμβολοσειρά α παράγει την Αγ.

• Γενικότερα Α→α και α ⇒∗ Αβ▪ Η αριστερή αναδρομή είναι ανεπιθύμητη στην

περίπτωση της από-πάνω προς τα κάτω ανάλυσης (top-down). • Γιατί;

Μέθοδος Απαλοιφής

▪ Έστω ο κανόνας Α::=Αα1|Αα2|...|Ααn|β1|...|βm

▪ Ο μετασχηματισμός περιλαμβάνει την εισαγωγή ενός νέου τερματικού Α' και την μεταγραφή του κανόνα στους ακόλουθους:Α::=β1Α'|...|βmΑ'Α'::=α1Α'|α2Α'|...|αnΑ'|ε

▪ Παράδειγμα:E::=E "+"T | E "-" T | T

Α::=Α α1 | Α α2 | β1

Α::=β1Α'γίνεται Ε::=ΤΕ'Α'::=α1Α'| α2Α' |ε γίνεται Ε'::="+"ΤΕ' | "-"ΤΕ'|ε

Αντικατάσταση▪ Οι μετασχηματισμοί για τις έμμεσες αναδρομές

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

▪ Αντικατάσταση είναι ο μετασχηματισμός στον οποίο αντικαθιστούμε ένα μη-τερματικό σύμβολο Β στο δεξιό μέλος ενός κανόνα Α με όλα τα εναλλακτικά δεξιά μέλη κανόνων που αφορούν το Β.

▪ Α::=α1Βα2 Α::=α1β1α2|α1β2α2|...|α1βnα2

▪ Β::=β1|β2|...|βn Β::=β1|β2|...|βn

Αριστερή Παραγοντοποίηση

▪ Για την αποδοτική υλοποίηση των συντακτικών αναλυτών δεν πρέπει δύο εναλλακτικοί κανόνες για ένα μη-τερματικό να ξεκινούν με το ίδιο πρόθεμα. Δηλαδή:Α::=αβ1|αβ2|...|αβn|γ1|γ2|...|γn

▪ Η γραμματική με αριστερή παραγοντοποίηση μετατρέπεται στην:Α::=αΒ|γ1|γ2|...|γn

Β::=β1|β2|...|βn

Άσκηση

▪ Εφαρμόστε αριστερή παραγοντοποίηση και τις απαραίτητες αντικαταστάσεις στην ακόλουθη γραμματική: S::=aBc|adeC|C|gB::=deC::=adefB

▪ Απάντηση:• Με αντικατάσταση της Β και της C το πρώτο σύνολο

κανόνων γίνεται:S::=adec|adeadefB|adefB|g• και με παραγοντοποίηση:S::=adeS'|gS'::=c|adefB|fB

Συναρτήσεις FIRST και FOLLOW

▪ Οι δύο συναρτήσεις ορίζονται για τα σύμβολα μιας γραμματικής και αφορούν την κατασκευή συντακτικών αναλυτών και των δύο τύπων.

▪ Έστω μια γραμματική G={T,N,P,S}• Η συνάρτηση FIRST(α) ορίζεται για κάθε

συμβολοσειρά α ∈ (Τ ∪ Ν)* και ισούται με το σύνολο των τερματικών συμβόλων με τα οποία μπορεί να ξεκινά μια συμβολοσειρά η οποία παράγεται από την α.

• Η συνάρτηση FOLLOW(A), όπου Α ∈ Ν, είναι το σύνολο των τερματικών συμβόλων που μπορεί να ακολουθούν την Α σε ένα προτασιακό τύπο.

Υπολογισμός Συνάρτησης FIRST (i)

▪ Για κάθε σύμβολο Χ της γραμματικής G, ισχύουν οι ακόλουθοι κανόνες υπολογισμού:• Αν Χ τερματικό τότε FIRST(X) ={X}• Αν Χ ∈ Ν και υπάρχει κανόνας Χ→ε, τότε

FIRST(X)=FIRST(X)∪{ε}• Αν Χ ∈ Ν, και για κάθε κανόνα Χ→Α1,Α2...Αn, τότε

FIRST(X) = FIRST(X)∪(FIRST(Ai) -{ε}), για κάθε i, τέτοιο ώστε ∀ j | 0<j<i ε∈FIRST(Aj).

• Εάν ∀ j | 0<j≤n ε∈FIRST(Aj), τότε FIRST(X)=FIRST(X)∪ {ε}

▪ Οι κανόνες εφαρμόζονται μέχρι να μην μπορούν να μεταβληθούν τα σύνολα FIRST.

Υπολογισμός Συνάρτησης FIRST (ii)

▪ Για κάθε συμβολοσειρά Χ1,Χ2,...,Χn • FIRST(Χ1,...,Χn) = FIRST(X1) – {ε}• Για κάθε i | 1<i≤n, εάν ∀ j | 0<j<i ε∈FIRST(Xj) τότε

FIRST(Χ1,...,Χn)=FIRST(Χ1,...,Χn)∪(FIRST(Xi)- {ε})

• Εάν για κάθε 0<i≤n, ε∈FIRST(Xi), τότε FIRST(Χ1,...,Χn) = FIRST(Χ1,...,Χn)∪{ε}

Συνάρτηση FOLLOW

▪ Δεδομένης μιας γραμματικής G={T,N,P,S}, και A∈Ν, τότε η συνάρτηση FOLLOW(A) ⊆ Τ∪{EOF}, ορίζεται ως:• Αν υπάρχει παραγωγή S ⇒* αAaβ, όπου α,β∈(Τ∪Ν)*

και a είναι τερματικό σύμβολο, τότε a∈FOLLOW(Α).• Αν υπάρχει παραγωγή S ⇒* αA, όπου α∈(Τ∪Ν)*

τότε EOF ∈ FOLLOW(Α).

Υπολογισμός της συνάρτησης FOLLOW

▪ FOLLOW(S)={EOF}▪ Για κάθε κανόνα της μορφής Α→αΒβ, όπου Α και

Β ∈ Ν και α,β∈(Τ∪Ν)*,FOLLOW(B)=FOLLOW(B)∪(FIRST(β)-{ε})

▪ Εάν ε∈FIRST(β) τοτε FOLLOW(B)=FOLLOW(B)∪FOLLOW(Α)

▪ Το παραπάνω εκτελείται μέχρι τα σύνολα FOLLOW να μην μεταβάλλονται.

Συντακτική Ανάλυση από Πάνω προς τα Κάτω

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

ενός κόμβου; • Ποιος από τους πιθανούς εναλλακτικούς

κανόνες θα χρησιμοποιηθεί για την αντικατάσταση του μη-τερματικού συμβόλου;

LL(1) Γραμματικές

▪ LL(1) γραμματική: Αναγνώσιμη από ένα LL(1) ΣΑ (αναδρομικής κατάβασης ή ΑΣ).• Υποσύνολο των γραμματικών χωρίς συμφραζόμενα,

αρκετά πλούσιο όμως για να περιγράψει τις περισσότερες γλώσσες.

▪ Προϋποθέσεις:• Για κάθε ζεύγος κανόνων παραγωγής Α→α και Α→β

πρέπει να ισχύει FIRST(α)∩FIRST(β) =∅ .• Αν το ε ανήκει στο FIRST(A) (για παράδειγμα

υπάρχει κανόνας Α→ε) πρέπει να ισχύει FIRST(Α)∩FOLLOW(Α) = ∅ .

LL(1) Γραμματικές

▪ Αποκλείονται οι γραμματικές:• Αριστερά αναδρομικές• Έχουν δύο εναλλακτικούς κανόνες με δεξιά μέλη που

ξεκινούν με το ίδιο σύμβολο.• Έχουν δύο εναλλακτικούς κανόνες τα δεξιά μέλη των

οποίων παράγουν την κενή συμβολοσειρά. ▪ Πως επιτυγχάνεται το παραπάνω;

• Απαλοιφή αριστερής αναδρομής• Αντικατάσταση• Αριστερή παραγοντοποίηση

Άσκηση● Είναι η ακόλουθη γραμματική LL; Αν όχι κάντε τους απαραίτητους μετασχηματισμούς ώστε να γίνει LL.

▪ S::= SS+ | SS* | a

▪ Απάντηση:▪ Όχι η γραμματική δεν είναι LL, καθώς είναι

αριστερά αναδρομική.

Απάντηση

▪ Οι μετασχηματισμοί που πρέπει να γίνουν είναι οι ακόλουθοι.

▪ (παραγοντοποίηση) • S::=SSB | a • B::=+|*

▪ (απαλοιφή αριστερής αναδρομής)• S::=aC • C::=SBC|ε• B::=+|*

▪ Εναλλακτικά θα μπορούσαν οι μετασχηματισμοί να γίνουν με διαφορετική σειρά.

Υπολογισμός FIRST

▪ FIRST(S)={a}▪ FIRST(B)={+,*}▪ FIRST(C)={ε + FIRST(S)}={ε,a}

▪ FOLLOW(S)={EOF,+FIRST(B)}={EOF,+,*}▪ FOLLOW(C)=FOLLOW(S)={EOF,+,*}▪ FOLLOW(B)={(FIRST(C)-ε))+FOLLOW(C)}={a

+FOLLOW(S)}={a,EOF,+,*}

S::=aC C::=SBC|εB::=+|*

ΣΑ Αναδρομικής Κατάβασης

▪ Recursive Descent ▪ ΣΑ από πάνω προς τα κάτω, εύκολα

κατασκευάσιμος χειρωνακτικά. ▪ Σε κάθε μη-τερματικό σύμβολο, αντιστοιχίζεται

μια ρουτίνα η οποία το αναγνωρίζει. ▪ Αποφυγή οπισθοδρόμησης: Χρήση της

συνάρτησης FIRST για την επιλογή της κατάλληλης ρουτίνας για την αναγνώριση, εξετάζοντας την επόμενη λεκτική μονάδα (lookahead).

ΣΑ Αναδρομικής Κατάβασης (ii)

▪ Έστω Α::=α1|α2|...|αn και η επόμενη λεκτική μονάδα είναι η token.

▪ O κώδικας για την αναγνώριση της Α είναι: if token ∈ FIRST(α1) then <κώδικας για την α1>...elseif token ∈ FIRST(αn) then <κώδικας για την αn>elseif ε ∉ FIRST(α1)∪...∪FIRST(αn) then <συντακτικό σφάλμα>elseif token ∉ FOLLOW(A) then <συντακτικό σφάλμα>

Χειροκίνητη Κατασκευή Συντακτικού Αναλυτή

▪ FIRST(S)={a}▪ FIRST(B)={+,*}▪ FIRST(C)={ε,a}▪ FOLLOW(S)={EOF,+,*}▪ FOLLOW(C)={EOF,+,*}▪ FOLLOW(B)={a,EOF,+,*}

void S() {if token=a match(a);call C; else error;}void B() {if token = + match(+) elseif token=* match(*); else error}void C(){if token = a call S; call B; call C;

elseif token not_in {EOF,+,*} error;}

S::=aC FIRST(aC)={a}C::=SBC|ε FIRST(SBC)={a}

FIRST(ε) = {ε}B::=+|* FIRST(+)={+}

FIRST(-)={-}

ΣΑ LL(1) Αυτομάτου Στοίβας

xn

...

x2

x1

a1 a2 am EOF...

Πίνακας Συντακτικής Ανάλυσης

LL(1)

Κατασκευή Πίνακα Συντακτικής Ανάλυσης

▪ Για κάθε κανόνα παραγωγής Α→β:• Για κάθε τερματικό σύμβολο a | a∈FIRST(β),

πρόσθεσε τον κανόνα Α→β στη θέση M[A,a]• Αν ε∈FIRST(β), τότε για κάθε τερματικό σύμβολο

a∈FOLLOW(Α), πρόσθεσε τον κανόνα Α→β στην θέση Μ[Α,a].

• Αν ε∈FIRST(β) και EOF∈FOLLOW(Α) τότε πρόσθεσε τον κανόνα Α→β στην θέση Μ[Α,EOF]

• Όσες θέσεις του πίνακα μένουν κενές συμπληρώνονται με την ένδειξη error (ή απλώς υπονοείται).

Πίνακας LL

▪ FIRST(S)={a}▪ FIRST(B)={+,*}▪ FIRST(C)={ε,a}▪ FOLLOW(S)={EOF,+,*}▪ FOLLOW(C)={EOF,+,*}▪ FOLLOW(B)={a,EOF,+,*}

S::=aC FIRST(aC)={a}C::=SBC|ε FIRST(SBC)={a}

FIRST(ε) = {ε}B::=+|* FIRST(+)={+}

FIRST(-)={-}

* + EOFB * +C ε ε SBC εS

a

aC

Λειτουργία ΣΑ LL(1)

▪ Συμπίπτει με την λειτουργία του ΑΣ.▪ Μέχρι η στοίβα να είναι κενή:

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

• Αν στην κορυφή της στοίβας είναι το μη-τερματικό Α, και το επόμενο σύμβολο της συμβολοσειράς εισόδου τότε είναι το a, και υπάρχει κανόνας Α→β στο Μ[Α,a], τότε το Α αφαιρείται από τη στοίβα και τοποθετούνται τα σύμβολα του β στη στοίβα.

• Αλλιώς σφάλμα.

Συντακτική Ανάλυση από Κάτω προς τα Πάνω

▪ Bottom-up Syntax Analysis▪ Δημιουργία δένδρου: Κατασκευή αριστερότερου

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

▪ Η κατασκευή του δένδρου τερματίζει όταν κατασκευαστεί το τερματικό σύμβολο της γραμματικής (ρίζα).

▪ Πρόβλημα: Ποιοι ήδη δημιουργημένοι κόμβοι θα χρησιμοποιηθούν ως παιδιά για την κατασκευή του νέου κόμβου;

Παράδειγμα

▪ Έστω η ακόλουθη γραμματική και η συμβολοσειρά id * id.

Ε ::= Ε "+" Τ | ΤT ::= Τ "*" F | FF ::= "id" | "(" E ")"▪ Η δημιουργία του δένδρου

περιλαμβάνει

id id*

id

id*F

id

id*

F

T *

id

id

*

F

id

T F

T

id

id

*

F

T F

E

T

id

id

*

F

T F

ΣΑ Ολίσθησης Ελάττωσης(shift-reduce)

▪ Γενική κατηγορία ΣΑ από κάτω προς τα πάνω ▪ Χρησιμοποιούν στοίβα για να αποθηκεύουν

τερματικά και μη-τερματικά σύμβολα.▪ Ενέργειες ενός ΣΑ:

• Ολίσθηση (shift), όπου ένα σύμβολο εισόδου τοποθετείται στη στοίβα

• Ελάττωση (reduce), όπου ένα ή περισσότερα σύμβολα από την κορυφή της στοίβας αντικαθίστανται από ένα μη-τερματικό σύμβολο.

• Αποδοχή (accept), όταν η στοίβα περιέχει το αρχικό σύμβολο της γραμματικής

• Σφάλμα (error), όταν εμφανιστεί συντακτικό σφάλμα.

Αποφάσεις κατά την διάρκεια της Συντακτικής Ανάλυσης

Ε ::= Ε "+" Τ | ΤT ::= Τ "*" F | FF ::= "id" | "(" E ")"

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

$F$T$T*

EOF$T*F EOF$T EOF$E EOF

id * id EOF shift$id *id EOF reduce F::=id

*id EOF reduce T::=F*id EOF shiftid EOF shift

$T*id reduce F::=idreduce T::=T*Freduce E::=T

accept

▪ Ελάττωση με κανόνα Ε::=Τ ή ολίσθηση?

▪ Ελάττωση με τον κανόνα Τ::=Τ*F ή T::=F?

ΣΑ LR(1)

▪ Οι ΣΑ της κατηγορίας υλοποιούνται με αυτόματο στοίβας της μορφής:

ΠΙΝΑΚΕΣ ΕΛΕΓΧΟΥ ΣΥΝΤΑΚΤΙΚΗΣ ΑΝΑΛΥΣΗΣ

ACTION NEXT

ΑΛΓΟΡΙΘΜΟΣ LR

a1 a2 am EOF...

xn

...

s1

x1

s0

sn

Λειτουργία ΣΑ LR

▪ Αρχικά, η στοίβα περιέχει μόνο η αρχική κατάσταση. ▪ Έστω ότι στην κορυφή της στοίβας βρίσκεται η

κατάσταση s και το σύμβολο εισόδου είναι a. Τότε αν το κελί του πίνακα action(s,a) περιέχει:• πράξη ολίσθησης, τότε το a τοποθετείται στη στοίβα

και μετά από αυτό η κατάσταση next(s,a).• πράξη ελάττωσης, με ένα κανόνα της μορφής Α::=β,

τότε αφαιρούνται από τη στοίβα |β| ζεύγη καταστάσεων-συμβόλων. Η επόμενη κατάσταση καθορίζεται από την ενέργεια s''=next(s',Α) (πίνακας ΝΕΧΤ), όπου s' το στοιχείο στην κορυφή της στοίβας. Τοποθετείται στη στοίβα το Α και η κατάσταση s''.

• πράξη αποδοχής, τότε ο ΣΑ σταματά.

Παράδειγμα Πίνακα ΣΑ LR

(1) Ε ::= Ε "+" Τ(2) Ε ::= Τ(3) T ::= Τ "*" F (4) T::=F(5) F::="(" E ")"(6) F ::= "id"

STATE Action Goto (Next)id + * ( ) EOF E T F

0 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

Παράδειγμα ανάλυσης της id * id + id

Στοίβα Είσοδος Ενέργεια1 0 id*id+id EOF shift (s5)

2 0 id 5 *id+id EOF reduce by F ::= id (r6)

3 0 F 3 *id+id EOF reduce T ::= F (r4)

4 0 T 2 *id+id EOF shift (s7)

5 0 T 2 * 7 id+id EOF shift (s5)

6 0 T 2 * 7 id 5 +id EOF reduce by F ::= id (r6)

7 0 T 2 * 7 F 10 +id EOF reduce by T::=T*F (r3)

8 0 T 2 +id EOF reduce by E ::= T (r2)

9 0 E 1 +id EOF shift (s6)

10 0 E 1 + 6 id EOF shift (s5)

11 0 E 1 + 6 id 5 EOF reduce by F ::= id (r6)

12 0 E 1 + 6 F 3 EOF reduce by T ::=F (r4)

13 0 E 1 + 6 T 9 EOF reduce by E::=E+T (r1)

14 0 E 1 EOF accept

Κατασκευή Πίνακα SLR(1)

▪ Για την κατασκευή του αντίστοιχου πίνακα συντακτικής ανάλυσης απαιτείται ο ορισμός:• της έννοιας του στοιχείου (item),• της συνάρτησης CLOSURE(I) (κλεισίματος) ενός

συνόλου στοιχείων,• της συνάρτησης GOTO(I,X) ενός συνόλου στοιχείων

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

• ορισμός των καταστάσεων του αυτομάτου.▪ Αλγόριθμος κατασκευής του πίνακα βάσει των

παραπάνω.

Στοιχεία (Items)

▪ Στοιχείο είναι ένας κανόνας παραγωγής, στον οποίο έχει προστεθεί το σύμβολο "●" . Για παράδειγμα στον κανόνα Α::= ΧΥΖ αντιστοιχούν τα ακόλουθα στοιχεία• Α::= ● ΧΥΖ, Α::= Χ●ΥΖ, Α::= ΧΥ●Ζ Α::= ΧΥΖ●

▪ Το σημείο "●" σηματοδοτεί το σημείο της συμβολοσειράς που έχουμε ήδη δει, και το τι περιμένουμε να δούμε στη συνέχεια.

Συνάρτηση CLOSURE(I)

▪ Η συνάρτηση CLOSURE (κλείσιμο) ενός συνόλου στοιχείων Ι της γραμματικής δίνεται από:• όλα τα στοιχεία του συνόλου Ι,• για κάθε στοιχείο του Ι της μορφής Α::=α●Ββ το

οποίο ανήκει στο σύνολο CLOSURE(I) και για κάθε κανόνα της γραμματικής της μορφής Β::=γ, το στοιχείο Β::=●γ ανήκει στο CLOSURE(I).

• Το παραπάνω βήμα εκτελείται μέχρι να μη ν μεταβάλλεται το CLOSURE(I).

Παράδειγμα Υπολογισμού CLOSURE(I)

▪ Έστω η (επαυξημένη) γραμματική:Ε' ::= ΕΕ ::= Ε "+" Τ | ΤT ::= Τ "*" F | FF ::= "id" | "(" E ")"

▪ Εάν θεωρήσω το σύνολο I0 = {E' ::=●E} η συνάρτηση CLOSURE(I0) είναι:

CLOSURE(I0) = {E'::=●E; E::=●E+T; E::=●T; T ::=●T * F; T ::= ●F; F ::=●(E); F ::= ●id }

Συνάρτηση GOTO(Ι,Χ)

▪ Η συνάρτηση GOTO(I,X) απεικονίζει ένα σύνολο στοιχείων Ι και ένα σύμβολο της γραμματικής Χ (τερματικό ή μη) σε ένα σύνολο Ι' στοιχείων τέτοιων ώστε:GOTO(I,X) = CLOSURE(J) J = {A::=αX●b | A::=α●Xb ∈ I}

▪ Παράδειγμα Υπολογισμού GOTO: I1={E'::=E●; E::=E●+T}

GOTO(I1,*) = {}GOTO(I1,+)={E::=E+●T; T::=●T*F;T::=●F; F::=●id; F::=●(E) }

Ε' ::= ΕΕ ::= Ε "+" Τ | ΤT ::= Τ "*" F | FF ::= "id" | "(" E ")"

Καταστάσεις του Αυτομάτου

▪ Αρχικά το αυτόματο δεν έχει "διαβάσει" κανένα σύμβολο. Άρα η αρχική του κατάσταση είναι:Ε' ::= ● E

▪ Φυσικά, το Ι0=CLOSURE(E'::= ● E)CLOSURE(E'::=●E) = {E'::=●E; E::=●E+T; E::=●T; T ::=●T * F; T ::= ●F; F ::=●(E); F ::= ●id }▪ Αν το αυτόματο διαβάσει ένα σύμβολο a τότε η

κατάσταση του θα δίνεται από την I1=GOTO(I0,a)

▪ Πχ. "ανάγνωση" σύμβολου id, άραGOTO(I0,id)={ F ::= id●} = I1

Κατασκευή Καταστάσεων▪ Έστω μια γραμματική G=(T,N,P,S) και η επαυξημένη

γραμματική: G'={T,N∪S',P∪(S'::=S),S'} ▪ Οι καταστάσεις Ι0, Ι1,...Ιn προκύπτουν από την

ακόλουθη διαδικασία:I0 = CLOSURE({S'::=●S})C = {I0}repeatforall Ιi ∈ C forall α ∈ (T∪N) if GOTO(Ιi,α)≠∅ and GOTO(Ιi,α) ∉ C then Ij = GOTO(Ιi,α) C = C ∪ { Ij}until C unchaged

Κατασκευή Πίνακα SLR(1) ΣΑ για μια Γραμματική G

1) Δημιουργία των καταστάσεων των στοιχείων της G.2) Για μια κατάσταση Ιi, αν υπάρχει στο Ιi κανόνας:

i) Α::=α●aβ και a είναι τερματικό σύμβολο και υπάρχει GOTO(Ιi,a)= Ιj τότε action(i,a)=shift j

ii) Α::=α● τότε για κάθε a στο FOLLOW(A) με Α≠S', τότε action(i,a)= reduce A::=α

iii) S'::=S● τότε action(i,EOF) = accept3) Για κάθε μη-τερματικό σύμβολο Α αν GOTO(Ιi,A)= Ιj

τότε next(i,A)= j4) Όλες οι άλλες θέσεις του πίνακα παίρνουν την τιμή

error.5) Η αρχική κατάσταση είναι η Ι0=CLOSURE({S'::=●S})

Παράδειγμα

▪ Να υπολογιστεί ο SLR πίνακας συντακτικής ανάλυσης για την γραμματικήS::=01|0S1

▪ Επαυξημένη ΓραμματικήS'::=SS::=01S::=0S1

▪ FIRST(S)={0} FOLLOW(S)={1,EOF}

Υπολογισμός GOTO

▪ I0={S'::= ● S,S::= ● 01, S::= ● 0S1}

▪ GOTO(I0,0)={S::= 0●1, S::= 0● S1,S::= ● 01, S::= ● 0S1} = I1

▪ GOTO(I0,1)={} <no state>

▪ GOTO(I0,S)={S'::=S●}=I2

▪ GOTO(I1,0)={S::= 0●1, S::= 0● S1,S::= ● 01, S::= ● 0S1} = I1

▪ GOTO(I1,1)={S::= 01●}=I3

▪ GOTO(I1,S)={S::= 0S●1}=I4

▪ GOTO(I4,1)={S::= 0S1●}=I5

S'::=S(1) S::=01(2) S::=0S1

Πίνακας SLR

0 1 EOF S0 s1 21 s1 s3 423 r1 r14 s55 r2 r2

accS'::=S(1) S::=01(2) S::=0S1

▪ I0={S'::= ● S,S::= ● 01, S::= ● 0S1}

▪ GOTO(I0,0)={S::= 0●1, S::= 0● S1,S::= ● 01, S::= ● 0S1} = I1

▪ GOTO(I0,S)={S'::=S●}=I2

▪ GOTO(I1,0)={S::= 0●1, S::= 0● S1,S::= ● 01, S::= ● 0S1} = I1

▪ GOTO(I1,1)={S::= 01●}=I3

▪ GOTO(I1,S)={S::= 0S●1}=I4

▪ GOTO(I4,1)={S::= 0S1●}=I5

Εξετάσεις

▪ Το σύγγραμα μοιράζεται από το Βιβλιοπωλείο ΑΝΙΚΟΥΛΑ (ισόγειο)

▪ Η ύλη είναι στο site του Μαθήματος.▪ Ερωτήσεις γρ. 529 ή e-mail.▪ Σύμφωνα με το πρόγραμμα οι εξετάσεις είναι:

Παρασκευή 1 Φεβρουαρίου 2008 15:00-17:00 Αιθ. 10Καλή επιτυχία!

Recommended