• Nenhum resultado encontrado

opencourses.auth | Ανοικτά Ακαδημαϊκά Μαθήματα ΑΠΘ | Σχεδίαση γλωσσών προγραμματισμού... | Αλγόριθμος Προβλέπουσας Αναδρομικής Κατάβασης

N/A
N/A
Protected

Academic year: 2023

Share "opencourses.auth | Ανοικτά Ακαδημαϊκά Μαθήματα ΑΠΘ | Σχεδίαση γλωσσών προγραμματισμού... | Αλγόριθμος Προβλέπουσας Αναδρομικής Κατάβασης"

Copied!
15
0
0

Texto

(1)

ΑΡΙ΢ΣΟΣΕΛΕΙΟ ΠΑΝΕΠΙ΢ΣΗΜΙΟ ΘΕ΢΢ΑΛΟΝΙΚΗ΢

ΑΝΟΙΚΣΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΣΑ

Σχεδίαση Γλωσσών &

Μεταγλωττιστζς

Ενότητα 6: Αλγόριθμοσ Προβλζπουςασ Αναδρομικήσ Κατάβαςησ

Επ. Καθ. Π. Κατςαρόσ

Τμήμα Πληροφορικήσ

(2)

• Το παρόν εκπαιδευτικό υλικό υπόκειται ςε άδειεσ χρήςησ Creative Commons.

• Για εκπαιδευτικό υλικό, όπωσ εικόνεσ, που

υπόκειται ςε άλλου τφπου άδεια χρήςησ, η

άδεια χρήςησ αναφζρεται ρητώσ.

(3)

Χρηματοδότηςη

• Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχθεί ςτα πλαίςια του εκπαιδευτικοφ ζργου του διδάςκοντα.

• Το ζργο «Ανοικτά Ακαδημαϊκά Μαθήματα ςτο Αριςτοτζλειο Πανεπιςτήμιο Θεςςαλονίκησ» ζχει χρηματοδοτήςει μόνο τη αναδιαμόρφωςη του εκπαιδευτικοφ υλικοφ.

• Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρηςιακοφ

Προγράμματοσ «Εκπαίδευςη και Δια Βίου Μάθηςη» και ςυγχρηματοδοτείται από την Ευρωπαϊκή Ζνωςη

(Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικοφσ πόρουσ.

(4)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 4

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης Ι

΢ηελ αλάιπζε αλαδξνκηθήο θαηάβαζεο ν θάζε θαλόλαο, πνπ αλαθέξεηαη ζε θάπνην κε ηεξκαηηθό ζύκβνιν, εθθξάδεηαη από ηνλ νξηζκό κηαο δηαδηθαζίαο, πνπ ζα ην αλαγλσξίδεη.

Έλαο αλαιπηήο πξνβιέπνπζαο αλαδξνκηθήο θαηάβαζεο απνηειείηαη:

από κία θαζνιηθή κεηαβιεηή, πνπ πεξηέρεη ηελ ηηκή ηεο ηξέρνπζαο ιεμηθήο κνλάδαο

από κία βνεζεηηθή δηαδηθαζία αλαγλώξηζεο, πνπ ειέγρεη αλ ε ηξέρνπζα ιεμηθή κνλάδα είλαη ε αλακελόκελε θαη θαιεί ηε δηαδηθαζία ιεμηθήο αλάιπζεο, γηα ηελ αλάγλσζε ηεο επόκελεο ιεμηθήο κνλάδαο θαη ηελ ελεκέξσζε ηεο θαζνιηθήο κεηαβιεηήο

από ηηο δηαδηθαζίεο αλάιπζεο, πνπ αληηζηνηρνύλ ζηα κε ηεξκαηηθά ζύκβνια ηεο γξακκαηηθήο

από κηα δηαδηθαζία εθθίλεζεο, πνπ αθνύ δηαβάζεη ηελ πξώηε ιεμηθή κνλάδα θαιεί ηε δηαδηθαζία, πνπ αληηζηνηρεί ζην κε ηεξκαηηθό

ζύκβνιν ηεο αξρήο.

(5)

ΜΑΘΗΜΑ: ΜΕΣΑΓΛΩΣΣΙ΢ΣΕ΢

ΔΙΔΑ΢ΚΩΝ: Π. ΚΑΣ΢ΑΡΟ΢

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 5

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης VΙ

Δνζείζεο κηαο γξακκαηηθήο πνπ έρεη ηελ ηδηόηεηα LL(1)

κπνξνύκε λα γξάςνπκε δηαδηθαζίεο πνπ λα αλαγλσξίδνπλ ην αξηζηεξό κέξνο ηεο θάζε παξαγσγήο

ν θώδηθαο ηεο αλάιπζεο είλαη απιόο θαη γξήγνξνο

Οι γπαμμαηικέρ με ηην ιδιόηηηα LL(1) ονομάζονηαι προγνώζιμες γραμμαηικές γιαηί ο αναλςηήρ μποπεί να «ππογνώζει» ηη ζωζηή ανάπηςξη ζε κάθε ζημείο ηηρ ανάλςζηρ.

Οι αναλςηέρ πος εκμεηαλλεύονηαι ηην ιδιόηηηα LL(1) ονομάζονηαι αναλσηές πρόγνωζης.

Μία πεπίπηωζη ανάλςζηρ ππόγνωζηρ είναι η ανάλσζη προβλέποσζας αναδρομικής καηάβαζης.

(6)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 6

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης 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 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 Term() { Factor(); TermPrime(); }

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();}

}

(7)

ΜΑΘΗΜΑ: ΜΕΣΑΓΛΩΣΣΙ΢ΣΕ΢

ΔΙΔΑ΢ΚΩΝ: Π. ΚΑΣ΢ΑΡΟ΢

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 7

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης VΙII

Παράδειγμα διορθωμένης γραμμαηικής αριθμηηικών εκθράζεων (βλ. διαθάνεια Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης ΙΙΙ) Γηα ηελ θαηαζθεπή παξάγσγνπ δέλδξνπ:

Γξάθνπκε κέζα ζηηο δηαδηθαζίεο θώδηθα γηα δεκηνπξγία θόκβνπ

Πεξλάκε ηνπο θόκβνπο από δηαδηθαζία ζε δηαδηθαζία κέζσ κηαο ζηνίβαο

Αθαηξνύκε από ηε ζηνίβα ηνπο θόκβνπο ηνπ δεμηνύ κέξνπο ηεο παξαγσγήο, ηνπο θάλνπκε απνγόλνπο ηνπ θόκβνπ ηνπ αξηζηεξνύ κέξνπο θαη εηζάγνπκε ηνλ ηειεπηαίν ζηε ζηνίβα

Γηα ηελ θαηαζθεπή ζπληαθηηθνύ δέλδξνπ Καηαζθεπάδνπκε ιηγόηεξνπο θόκβνπο

Χξεηάδεηαη λα ηνπο βάδνπκε ζηε ζηνίβα κε ηελ θαηάιιειε ζεηξά ώζηε λα εμαζθαιίδνπκε αξηζηεξή πξνζεηαηξηζηηθόηεηα

Expr() {

Term(); ExprPrime();

/*

δημιοςπγία κόμβος Expr;

εξαγωγή κόμβος ExprPrime από ζηοίβα;

εξαγωγή κόμβος Term από ζηοίβα;

καθιζηούμε ExprPrime και Term απογόνοςρ ηος Expr;

ειζαγωγή κόμβος Expr ζηη ζηοίβα;

*/

}

(8)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 8

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης IΧ

Άλλο παράδειγμα

S = “if” E “then” S “else” S

| “begin” S L

| “print” E.

L = “end”

| “;” S L.

E = “num” “=” “num”

void S() {

switch(lookahead) {

case IF: match(IF); E(); match(THEN); S();

match(ELSE); S(); break;

case BEGIN: matvh(BEGIN); S(); L(); break;

case PRINT: match(PRINT); E(); break;

default: error();

} }

void E() { match(NUM); match(EQ); match(NUM); }

void L() {

switch(lookahead) {

case END: match(END); break;

case SEMI: match(SEMI); S();

L(); break;

default: error();

} }

(9)

ΜΑΘΗΜΑ: ΜΕΣΑΓΛΩΣΣΙ΢ΣΕ΢

ΔΙΔΑ΢ΚΩΝ: Π. ΚΑΣ΢ΑΡΟ΢

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 9

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης Χ

Άλλο παράδειγμα (ζσνέτεια) πρόηαζη: if 2=2 then print 5=5 else print 1=1

main: κλήση S();

S1: ευαρμογή της παραγωγής (S, IF) : Sif E then S else S S1: match(IF);

S1: κλήση E();

E1: ευαρμογή της παραγωγής για (E, NUM): Enum = num E1: match(NUM); match(EQ); match(NUM);

E1: return για E1 στο S1 S1: match(THEN);

S1:κλήση S();

S2: ευαρμογή της παραγωγής για (S, PRINT): Sprint E S2: match(PRINT);

S2: κλήση E();

E2: ευαρμογή της παραγωγής για (E, NUM): Enum = num E2: match(NUM); match(EQ); match(NUM);

E2: return για E2 στο S2 S2: return για S2 στο S1

S1: match(ELSE);

S1: κλήση S();

S3: ευαρμογή της παραγωγής για (S, PRINT): Sprint E S3: match(PRINT);

S3: κλήση E();

E3: ευαρμογή της παραγωγής για (E, NUM): Enum = num E3: match(NUM); match(EQ); match(NUM);

E3: return για E2 στο S3 S3: return για S3 στο S1

S1: return για S1 στο main main: match(EOF); return success;

(10)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 10

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης ΙΙI

Η πξνβιέπνπζα αλαδξνκηθή θαηάβαζε ζηεξίδεηαη ζηελ πρόγνωζη ηνπ θαηάιιεινπ θάζε θνξά θαλόλα, πνπ νδεγεί ζηελ παξαγσγή ηνπ δέλδξνπ ηεο πξόηαζεο.

Δε μπορεί να εθαρμοζθεί ζε αριζηερά αναδρομικές

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

Αο ζεσξήζνπκε ηε κε αξηζηεξά αλαδξνκηθή γξακκαηηθή ησλ αξηζκεηηθώλ εθθξάζεσλ:

S = έθθξαζε.

έθθξαζε = όξνο ππ_όξνη.

ππ_όξνη = “+” όξνο ππ_όξνη | “-” όξνο ππ_όξνη | ε.

όξνο = παξάγνληαο ππ_παξαγ.

ππ_παξαγ = “*” παξάγνληαο ππ_παξαγ | “/” παξάγνληαο ππ_παξαγ | ε.

παξάγνληαο = “(”έθθξαζε “)” | “αξηζκόο”.

(11)

ΜΑΘΗΜΑ: ΜΕΣΑΓΛΩΣΣΙ΢ΣΕ΢

ΔΙΔΑ΢ΚΩΝ: Π. ΚΑΣ΢ΑΡΟ΢

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 11

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης ΙV

Γηα ην κε ηεξκαηηθό ζύκβνιν «έθθξαζε», κπνξεί ελαιιαθηηθά λα έρνπκε ηελ παξαγσγή,

έθθξαζε  όξνο ππ_όξνη  παξάγνληαο ππ_παξαγ ππ_όξνη  (έθθξαζε) ππ_παξαγ ππ_όξνη . . . .

ή ηελ παξαγσγή

έθθξαζε  όξνο ππ_όξνη  παξάγνληαο ππ_παξαγ ππ_όξνη  αριθμός ππ_παξαγ ππ_όξνη . . . .

Γεληθά, γηα λα ζηεξηρζεί ε αλάιπζε ζηελ ηερληθή ηεο πξόγλσζεο ρξεηάδεηαη γηα θάζε κε ηεξκαηηθό ζύκβνιν, λα είλαη εθ ησλ πξνηέξσλ γλσζηό ηo ζύλνιν ησλ ηεξκαηηθώλ, πνπ είλαη δπλαηό λα εκθαληζζνύλ ζηελ αξρή ησλ ζπκβνινζεηξώλ, πνπ παξάγνληαη από απηό (ζύλνιν FIRST). Επηπιένλ, αλ ε γξακκαηηθή

πεξηιακβάλεη θαλόλεο-ε, ηόηε γηα θάζε κε ηεξκαηηθό ζύκβνιν πνπ βξίζθεηαη ζην αξηζηεξό κέξνο ελόο ηέηνηνπ θαλόλα, επηβάιιεηαη θαη ν ππνινγηζκόο ηνπ ζπλόινπ ησλ ηεξκαηηθώλ, πνπ κπνξεί λα εκθαληζζνύλ ακέζσο κεηά από απηό (ζύλνιν FOLLOW).

(12)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 12

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης V

Αλάιπζε πξόγλσζεο: θεληξηθή ηδέα

Δνζείζεο κηαο παξαγσγήο A

 , ν αλαιπηήο πξέπεη λα είλαη ζε ζέζε λα επηιέμεη κεηαμύ

&

΢ύλνια FIRST

Γηα έλα δεμί κέξνο παξαγσγήο G, νξίδνπκε σο FIRST() ην ζύλνιν ησλ αλαγλσξηζηηθώλ πνπ εκθαλίδνληαη πξώηα ζηηο ζπκβνινζεηξέο πνπ

παξάγνληαη από ην .

Δειαδή ηζρύεη, x  FIRST() αλ θαη κόλν αλ  * x , γηα θάπνηα ζπκβνινζεηξά 

Γξακκαηηθή LL(1)

Αλ A

θαη A  εκθαλίδνληαη ζηε γξακκαηηθή πξέπεη FIRST(

)  FIRST() = 

Απηό επηηξέπεη ζηνλ αλαιπηή λα πξνγλώζεη κε αζθάιεηα ηελ παξαγσγή πνπ ζα ρξεζηκνπνηεί ζε θάζε βήκα!

(13)

ΜΑΘΗΜΑ: ΜΕΣΑΓΛΩΣΣΙ΢ΣΕ΢

ΔΙΔΑ΢ΚΩΝ: Π. ΚΑΣ΢ΑΡΟ΢

Recursive descent με ζύνολα FIRST & Follow

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 13

(14)

Σεηάξηε, 23 Ινπιίνπ 2014

Σκ. Πιεξνθνξηθήο, Α.Π.Θ. 14

Ανάλσζη προβλέποσζας αναδρομικής καηάβαζης ΧVΙΙ

Δεν μπορούν να τρηζιμοποιηθούν αριζηερά αναδρομικές γραμμαηικές.

Δεν μπορούν να τρηζιμοποιηθούν

γραμμαηικές, ποσ δεν είναι LL(1), όπσο π.ρ.:

ζεηξά_εληνιώλ = εληνιή “;” ζεηξά_εληνιώλ | εληνιή.

εληνιή = “ηεξκαηηθό”.

(15)

ΑΡΙ΢ΣΟΣΕΛΕΙΟ ΠΑΝΕΠΙ΢ΣΗΜΙΟ ΘΕ΢΢ΑΛΟΝΙΚΗ΢

ΑΝΟΙΚΣΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΣΑ

Τζλος ενότητας

Επεξεργαςία: Εμμανουζλα Στάχτιαρη

Θεςςαλονίκη, 21/07/2014

Referências

Documentos relacionados

Διπολικά τρανζίστορ ισχύος Επίδραση συσκευασίας case 1/2 όπου θJC η θερμική αντίσταση μεταξύ ένωσης και συσκευασίας σε C/W και θCΑ η θερμική αντίσταση μεταξύ συσκευασίας και