ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Συντακτικός αναλυτής Διδάσκων: Επικ. Καθ. Γεώργιος Μανής
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Συντακτικός Αναλυτής Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής
Οι Φάςεισ τησ Μεταγλώττιςησ λεκτική ανάλυση ςυντακτικι ανάλυςθ Πίνακασ Συμβόλων ςθμαςιολογικι ανάλυςθ παραγωγι ενδιάμεςου κϊδικα Διαχείριςθ λακϊν βελτιςτοποίθςθ ενδιάμεςου κϊδικα παραγωγι τελικοφ κϊδικα βελτιςτοποίθςθ τελικοφ κϊδικα
Συντακτική Ανάλυςη Λεκτικζσ Μονάδεσ Συντακτικι Ανάλυςθ Συντακτικό δζντρο Διαγνωςτικά μθνφματα
Λειτουργία Συντακτικοφ Αναλυτή Γίνεται ζλεγχοσ για να διαπιςτωκεί εάν το πθγαίο πρόγραμμα ανικει ι όχι ςτθ γλϊςςα δθμιουργεί το κατάλλθλο «περιβάλλον» μζςα από το οποίο αργότερα κα κλθκοφν οι ςθμαντικζσ ρουτίνεσ. Υπάρχουν πολλοί τρόποι για να καταςκευαςτεί ζνασ ςυντακτικόσ αναλυτισ Θα προτιμιςουμε τθ ςυντακτικι ανάλυςθ με αναδρομικι κατάβαςθ Βαςίηεται ςε γραμματικι LL(1)
Γραμματική LL(1) L L : left to right : leftmost derivation (1) : one look-ahead symbol Η γραμματικι LL(1) αναγνωρίηει από αριςτερά ςτα δεξιά, τθν αριςτερότερθ δυνατι παραγωγι και όταν βρίςκεται ςε δίλλθμα ποιον κανόνα να ακολουκιςει τθσ αρκεί να κοιτάξει το αμζςωσ επόμενο ςφμβολο ςτθν ςυμβολοςειρά ειςόδου
Γραμματική LL(1) Παράδειγμα: S ::= while(condition) S S ::= print(expression) S ::= input(id) S ::= { S ςτο παραπάνω τμιμα γραμματικισ, όταν πρζπει να αναγνωρίηουμε S, τότε ακολουκοφμε τον πρϊτο κανόνα αν θ επόμενθ λεκτικι μονάδα ςτθ είςοδο είναι το while, τον δεφτερο εάν είναι το print, τον τρίτο εάν είναι το input και τον τζταρτο εάν είναι το άνοιγμα αγκίςτρου
Ανάλυςη από πάνω προσ τα κάτω Γραμματικι: S ::= aabc A ::= Ab A ::= csb S ::= ε B ::= a Συμβολοςειρά ειςόδου: acabac Παραγωγι: S ::= aabc S ::= aabbc S ::= acsbbbc S ::= acabac
Εςωτερική Λειτουργία Για κάκε ζναν από τουσ κανόνεσ τθσ γραμματικισ, φτιάχνουμε και ζνα αντίςτοιχο υποπρόγραμμα Όταν ςυναντάμε μθ τερματικό ςφμβολο καλοφμε το αντίςτοιχο υποπρόγραμμα Όταν ςυναντάμε τερματικό ςφμβολο, τότε εάν και ο λεκτικόσ αναλυτισ επιςτρζφει λεκτικι μονάδα που αντιςτοιχεί ςτο τερματικό αυτό ςφμβολο ζχουμε αναγνωρίςει επιτυχϊσ τθ λεκτικι μονάδα αντίκετα εάν ο λεκτικόσ αναλυτισ δεν επιςτρζψει τθ λεκτικι μονάδα που περιμζνει ο ςυντακτικόσ αναλυτισ, ζχουμε λάκοσ και καλείται ο διαχειριςτισ ςφαλμάτων Όταν αναγνωριςτεί και θ τελευταία λζξθ του πθγαίου προγράμματοσ, τότε θ ςυντακτικι ανάλυςθ ζχει ςτεφτεί με επιτυχία.
Παράδειγμα Ένα Τμήμα Γραμματικήσ <PROGRAM> <PROGRAMBLOCK> <BLOCK> <DECLARATIONS> <CONSTDECL> ::= program ID <PROGRAMBLOCK> ::= <DECLARATIONS> <SUBPROGRAMS> <BLOCK> ::= begin <SEQUENCE> end ::= <CONSTDECL> <VARDECL> ::= const <ASSIGNLIST> ; ε...
Από τη Γραμματική ςτον Κώδικα <PROGRAM> ::= program ID <PROGRAMBLOCK> void program() { if (token==programtk) { token=lex(); if (token==idtk) { token=lex(); programblock(); else error( program name exprected ); else error ( the keyword program was expected );
Από τη Γραμματική ςτον Κώδικα <PROGRAMBLOCK> ::= <DECLARATIONS> <SUBPROGRAMS> <BLOCK> void programblock() { declarations(); subprograms(); block();
Από τη Γραμματική ςτον Κώδικα <BLOCK> ::= begin <SEQUENCE> end void block() { if (token==begintk) { token=lex(); sequence(); if (token==endtk) token=lex(); else error ( the keyword end was expected ); else error ( the keyword begin was expected );
Από τη Γραμματική ςτον Κώδικα <DECLARATRIONS> ::= <CONSTDECL><VARDECL> void declarations() { constdecl(); vardecl(); <CONSTDECL>::= const <ASSIGNLIST> ; ε void constdecl() { if (token==consttk) { token=lex(); assignlist();
Παράδειγμα Ένα Τμήμα Γραμματικήσ <IF-STAT> <ELSEPART> ::= if <CONDITION> then <BLOCK> <ELSEPART> ::= ε else <BLOCK>... <BOOLFACTOR> ::= not <CONDITION> ( <CONDITION> ) <EXPRESSION> <RELATIONAL-OPER> <EXPRESSION> <EXPRESSION>... := <OPTIONAL-SIGN> <TERM> ( <ADD-OPER> <TERM>)*
Από τη Γραμματική ςτον Κώδικα <IF-STAT> ::= if <CONDITION> then <BLOCK> <ELSEPART> void if_stat() { if (token==iftk) { token=lex(); condition(); if (token==thentk) { token=lex(); block(); elsepart(); κα υπάρχει πάντα if αλλιϊσ δε κα μπει μζςα ςτθν IF-STAT else error ( the keyword then was expected ); else error ( the keyword if was expected );
Από τη Γραμματική ςτον Κώδικα <ELSEPART> ::= else <BLOCK> ε void elsepart() { if (token==elsetk) { token=lex(); block();
Από τη Γραμματική ςτον Κώδικα <BOOLFACTOR> ::= not <CONDITION> ( <CONDITION> ) <EXPRESSION> <RELATIONAL-OPER> <EXPRESSION> void boolfactor() { if (token==nottk) { token=lex(); condition(); else if (token==leftpartk) { token=lex(); condition(); if (token==rightpartk) token=lex() else error( right bracket expected ); else { expression(); relationaloper(); expression();
Από τη Γραμματική ςτον Κώδικα <EXPRESSION>::=<OPTIONAL-SIGN> <TERM> (<ADD-OPER> <TERM>) * void expression() { optionalsign(); term(); while (token==plustk token==minustk) { addoper(); term();
Συντακτική Ανάλυςη με το Εργαλείο yacc Yacc γραμματική yypasre() Διαγνωστικά μηνύματα
Παράδειγμα Γραμματικήσ
Παράδειγμα calculator - lex
Παράδειγμα calculator - yacc
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http://ecourse.uoi.gr/course/view.php?id=1125.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επικ. Καθ. Γεώργιος Μανής. «Μεταφραστές. Συντακτικός αναλυτής». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1125.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/