ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Λεκτικός αναλυτής Διδάσκων: Επικ. Καθ. Γεώργιος Μανής
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Λεκτικός Αναλυτής Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής
Οι Φάσεις της Μεταγλώττισης λεκτική ανάλυση συντακτική ανάλυση Πίνακας Συμβόλων σημασιολογική ανάλυση παραγωγή ενδιάμεσου κώδικα Διαχείριση λαθών βελτιστοποίηση ενδιάμεσου κώδικα παραγωγή τελικού κώδικα βελτιστοποίηση τελικού κώδικα
Λεκτική Ανάλυση Αρχικό πρόγραμμα Χαρακτήρας-χαρακτήρας Λεκτική Ανάλυση Λεκτικές μονάδες Διαγνωστικά μηνύματα
Διαπροσωπεία Λεκτικού Αναλυτή Καλείται ως συνάρτηση από το συντακτικό αναλυτή Διαβάζει γράμμα-γράμμα το πηγαίο πρόγραμμα Κάθε φορά που καλείται επιστρέφει την επόμενη λεκτική μονάδα Επιστρέφει στο συντακτικό αναλυτή έναν ακέραιο που χαρακτηρίζει τη λεκτική μονάδα τη λεκτική μονάδα
Εσωτερική Λειτουργία Ο λεκτικός αναλυτής εσωτερικά λειτουργεί σαν ένα αυτόματο καταστάσεων το οποίο ξεκινά από μία αρχική κατάσταση, με την είσοδο κάθε χαρακτήρα αλλάζει κατάσταση έως ότου συναντήσει μία τελική κατάσταση Το αυτόματο καταστάσεων αναγνωρίζει δεσμευμένες λέξεις πχ. if, for, while σύμβολα της γλώσσας π.χ. «+», «;», «=» αναγνωριστικά και σταθερές π.χ. counter, a12, 32768 λάθη π.χ. μη επιτρεπτός χαρακτήρας, κλείσιμο σχολίων χωρίς να έχουν ανοίξει προηγουμένως
Παράδειγμα Αυτόματου Το αυτόματο του επόμενου παραδείγματος αναγνωρίζει: αναγνωριστικά που ξεκινούν από γράμμα και αποτελούνται από γράμματα ή ψηφία φυσικούς αριθμούς ως αριθμητικές σταθερές τα αριθμητικά σύμβολα + - * / τους σχεσιακούς τελεστές < > = >= <= <> τα σύμβολα := ( ), ; σχόλια που περικλείονται σε άγκιστρα { } και αγνοούνται
Αυτόματο λευκός χαρακτήρας αρχική κατάσταση 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 όταν στην αρχική κατάσταση έρθει λευκός χαρακτήρας, ουσιαστικά αγνοείται και μένουμε στην ίδια κατάσταση γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 όταν στην αρχική κατάσταση έρθει γράμμα, τότε μεταβαίνουμε στην κατάσταση 1 που θα μας οδηγήσει σε αναγνωριστικό γράμμα 1 γράμμα / ψηφίο αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα στη συνέχεια όσο λαμβάνουμε γράμμα ή ψηφίο μένουμε στην ίδια κατάσταση, προσθέτοντας το γράμμα ή το ψηφίο στο αναγνωριστικό που θα καταλήξουμε γράμμα / ψηφίο 1 αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα 1 γράμμα / ψηφίο αν έρθει κάτι που δεν είναι γράμμα ή ψηφίο τότε θεωρούμε ότι το αναγνωριστικό ολοκληρώθηκε και πηγαίνουμε σε τελική κατάσταση αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο 2 ψηφίο έτσι αναγνωρίσαμε λεκτική μονάδα και ο λεκτικός αναλυτής τερματίζει αφού την επιστρέψει στον συντακτικό αναλυτή αριθμ. σταθερά
Αυτόματο όταν ξανακληθεί ο λεκτικός αναλυτής θα ξεκινήσει πάλι από την αρχική κατάσταση, αλλά θα διαβάζει τους χαρακτήρες από εκεί που σταμάτησε 0 λευκός χαρακτήρας γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο ψηφίο 2 αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό όταν στην αρχική κατάσταση έρθει ψηφίο, τότε μεταβαίνουμε στην κατάσταση 2 που θα μας οδηγήσει σε αριθμητική σταθερά ψηφίο 2 ψηφίο αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο 2 ψηφίο στη συνέχεια όσο λαμβάνουμε ψηφίο μένουμε στην ίδια κατάσταση, προσθέτοντας το ψηφίο στην αριθμητική σταθερά που θα καταλήξουμε αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο 2 ψηφίο αν έρθει κάτι που δεν είναι ψηφίο τότε θεωρούμε ότι η αριθμητική σταθερά ολοκληρώθηκε και πηγαίνουμε σε τελική κατάσταση αριθμ. σταθερά
Αυτόματο λευκός χαρακτήρας 0 γράμμα / ψηφίο γράμμα 1 αναγνωριστικό ψηφίο 2 ψηφίο έτσι αναγνωρίσαμε αριθμητική σταθερά και ο λεκτικός αναλυτής τερματίζει αφού την επιστρέψει στον συντακτικό αναλυτή αριθμ. σταθερά
Αυτόματο + - * / = + - * / = όταν από την αρχική κατάσταση έρθει το σύμβολο «+» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «-» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «*» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «/» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «=» το αναγνωρίζουμε
Αυτόματο όταν από την αρχική κατάσταση έρθει το σύμβολο «<» τότε υπάρχουν τρεις περιπτώσεις < 3 = > <= <> < > 4 = >= >
Αυτόματο < 3 = <= να ακολουθεί «=» οπότε αναγνωρίζουμε «<=» > <> να ακολουθεί «>» οπότε αναγνωρίζουμε «<>» < > 4 = >= >
Αυτόματο < 3 = <= > <> < οτιδήποτε άλλο και να ακολουθεί αναγνωρίζουμε «<» > 4 = >= >
Αυτόματο < 3 = <= > <> < > 4 = >= όμοια και εδώ, αν το «>» το ακολουθεί «=» αναγνωρίζουμε «<=» >
Αυτόματο < 3 = <= > <> < > 4 = >= > οτιδήποτε άλλο και να ακολουθεί αναγνωρίζουμε «>»
Αυτόματο : 5 = := λάθος αν από την αρχική κατάσταση συναντήσουμε μια «:», τότε υπάρχει μόνο μία επιλογή να καταλήξουμε σε «:=» έτσι αν μετά την «:» έρθει «=» αναγνωρίζουμε «:=», ενώ σε κάθε άλλη περίπτωση αναγνωρίζουμε λάθος εδώ δεν μπορούμε να αναγνωρίσουμε την «:» ως λεκτική μονάδα όπως κάναμε για το «<» και το «>» αφού το «:» δεν αποτελεί σύμβολο της γλώσσας
Αυτόματο αν από την αρχική κατάσταση συναντήσουμε άνοιγμα σχολίων τότε ό,τι ακολουθήσει αγνοείται έως ότου βρεθεί κλείσιμο σχολίων οπότε μεταβαίνουμε στην κατάσταση 0, που είναι η αρχική κατάσταση { 6 } 0 eof λάθος
Αυτόματο { 6 } 0 eof λάθος αν πριν βρεθεί κλείσιμο σχολίων βρεθεί τέλος αρχείου σημαίνει ότι άνοιξαν σχόλια χωρίς να κλείσουν. Προφανώς έχουμε εδώ λάθος θα μπορούσε να τροποποιηθεί το αυτόματο αν επιθυμούμε να θεωρούνται διαφορετικά πράγματα λάθος, για παράδειγμα αν θέλουμε το {{ } να μην είναι επιτρεπτό
Αυτόματο, ; ) ( eof, ; ) ( eof όταν από την αρχική κατάσταση έρθει το σύμβολο «,» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «;» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «)» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το σύμβολο «(» το αναγνωρίζουμε όταν από την αρχική κατάσταση έρθει το τέλος αρχείου το αναγνωρίζουμε λάθος
Αυτόματο, ;, ; ) ( ) ( eof eof λάθος όταν από την αρχική κατάσταση έρθει οτιδήποτε άλλο, τότε προφανώς αυτό δε μπορεί να μας οδηγήσει σε τελική κατάσταση, οπότε αναγνωρίζουμε την ύπαρξη λάθους
Αυτόματο λευκός χαρακτήρας 0 γράμμα 1 γράμμα / ψηφίο από τα αναγνωριστικά ξεχωρίζουμε τις δεσμευμένες λέξεις αναγνωριστικό for id while do else
Οπισθοδρόμηση Για να αναγνωρίσουμε μία λεκτική μονάδα μερικές φορές καταναλώνουμε ένα χαρακτήρα από την επόμενη λεκτική μονάδα Ο χαρακτήρας αυτός πρέπει να ενσωματωθεί στην επόμενη λεκτική μονάδα Αυτό συμβαίνει στο παράδειγμά μας στα αναγνωριστικά και στις αριθμητικές σταθερές στα δεσμευμένα σύμβολα < και >
Παράδειγμα Υλοποίησης Αυτόματου με Πίνακα Έστω το αυτόματο το οποίο αναγνωρίζει λεκτικές μονάδες που αποτελούνται από μία σειρά από 1 ή περισσότερα x ακολουθούμενη από ένα y ακριβώς και μετά από μία σειρά από 0 ή περισσότερα x, δηλαδή x + yx* x x x y 0 1 2 OK y error
Υλοποίηση με Πίνακα #define x 0 #define y 1 #define other 2 #define state0 0 #define state1 1 #define state2 2 #define error -1 #define OK -2 x y other state0 state1 state2 state1 error error state1 state2 error state2 error OK
Υλοποίηση με Πίνακα state = state0; while (state!=ok && state!=error) { newsymbol(&inp); state = Trans_Diagram [state][inp]; }
Εναλλακτική Υλοποίηση με Σειρά Εντολών Απόφασης state = state0; while (state!=ok && state!=error) { if (state==state0 && input==x) state=state1; else if (state==state0) state=error; else if (state==state1 && input==x) state=state1; else if (state==state1 && input==y) state=state2; else if (state==state1) state=error; else if (state==state2 && input==x) state=state2 else if (state==state2 && input==y) state=error else if (state==state2) state=ok }
Το Εργαλείο Lex (flex) Lex Μεταπρόγραμμα yylex() Διαγνωστικά μηνύματα
Μετάφραση με τα Eργαλεία Lex-Yacc
Αναγνώριση με Κανονικές Εκφράσεις
Παράδειγμα Αναγνώρισης με το Lex letter [a-za-z] digit [0-9] delim [" "\t\n] id {letter}({letter} {digit})* number {digit}+
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 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/