Γλώσσες Προγραμματισμού Μεταγλωττιστές Λεκτική Ανάλυση Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Το αλφαριθμητικό (string)
Advertisements

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ
Copyright © 2005 Elsevier Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott.
7.3.8 Μεταφραστές Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
ΓΡΑΜΜΑΤΙΚΕΣ ΧΩΡΙΣ ΣΥΜΦΡΑΖΟΜΕΝΑ I
Λογισμικό Συστήματος Κλειώ Σγουροπούλου.
Ένα απλό πρόγραμμα σε C /* ********************************************* * This program prints out the sentence “This is a test.” * *********************************************
ΘΕΩΡΙΑ ΓΛΩΣΣΩΝ & ΑΥΤΟΜΑΤΩΝ: ΕΙΣΑΓΩΓΗ Ι
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων, Σημασιολογικές Ενέργειες.
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών9-1 Στατικός Έλεγχος Με τον όρο στατικός έλεγχος (static checking) χαρακτηρίζεται ο έλεγχος της συντακτικής.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
Κεφάλαιο 2ο Πεπερασμένα αυτόματα.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
ΕΠΛ223 Θεωρία και Πρακτική Μεταγλωττιστών Εαρινό Εξάμηνο 2002 Κ. Μουρλάς, Λέκτορας Σημείωση: Οι διαφάνειες αυτές βασίζονται κατά το μεγαλύτερο μέρος τους.
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
ΣΥΝΑΡΤΗΣΕΙΣ.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων Φροντιστήριο - 30/04/2009.
ΘΠ06 - Μεταγλωττιστές Εισαγωγή στον Bison Φροντιστήριο - 30/03/2009.
Ενότητα Α.4. Δομημένος Προγραμματισμός
ΘΠ06 - Μεταγλωττιστές Συντακτική Ανάλυση, Bison 1.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΜΑΘΗΜΑ: ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ ΔΙΔΑΣΚΟΝΤΕΣ: Π. ΚΑΤΣΑΡΟΣ Τρίτη, 31 Μαρτίου 2015Τρίτη, 31 Μαρτίου 2015Τρίτη, 31 Μαρτίου 2015Τρίτη, 31 Μαρτίου 2015Τμ. Πληροφορικής,
ΝΤΕΝΤΕΡΜΙΝΙΣΤΙΚΑ ΠΕΠΕΡΑΣΜΕΝΑ ΑΥΤΟΜΑΤΑ Ι
ΜΑΘΗΜΑ: ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τμ. Πληροφορικής,
ΕΠΛ 223 Θεωρία και Πρακτική Μεταγλωττιστών7-1 Πίνακας Συμβόλων Πίνακας συμβόλων: δομή δεδομένων που χρησιμοποιείται για την αποθήκευση διαφόρων πληροφοριών.
ΜΑΘΗΜΑ: ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ ΔΙΔΑΣΚΟΝΤΕΣ: Π. ΚΑΤΣΑΡΟΣ Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τετάρτη, 1 Απριλίου 2015Τμ. Πληροφορικής,
Επικοινωνία Ανθρώπου Μηχανής HTML CGI JAVASCRIPT Κουμπούλης Χρήστος Α.Μ. 921 Χαλαβαζής Βασίλης Α.Μ. 988.
Slide 1/42 ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο Εισαγωγή στο Flex.
ΘΠ06 - Μεταγλωττιστές Εισαγωγή στον Bison Φροντιστήριο - 23/03/2010.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 9: Παραγωγή Ενδιάμεσου Κώδικα (Ενδιάμεσες Γλώσσες) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά.
Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών – Τμήμα Πληροφορικής και Τηλεπικοινωνιών 1 Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας Προπτυχιακό.
ΜΑΘΗΜΑ: ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ ΔΙΔΑΣΚΟΝΤΕΣ: Κ. ΛΑΖΟΣ - Π. ΚΑΤΣΑΡΟΣ Τρίτη, 14 Απριλίου 2015Τρίτη, 14 Απριλίου 2015Τρίτη, 14 Απριλίου 2015Τρίτη, 14 Απριλίου 2015Τμ.
Περιεχόμενα Μαθήματος
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 13: Επαναληπτικό μάθημα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Το περιεχόμενο του μαθήματος διατίθεται.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 8: Πίνακας Συμβόλων Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 10: Παραγωγή Ενδιάμεσου Κώδικα (Σημασιολογικές ρουτίνες μετάφρασης-Μέρος Α) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 11: Βελτιστοποίηση Ενδιάμεσου Κώδικα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα.
Περιεχόμενα Μαθήματος
Διαγνώσιμες και μη-διαγνώσιμες ασυμφραστικές γραμματικές και γλώσσες
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
Slide 1/52 ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο Yacc.
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΚΕΦΑΛΑΙΟ Το αλφάβητο της ΓΛΩΣΣΑΣ
ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Συντακτική Ανάλυση II Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Λεκτική Ανάλυση II Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Συντακτική Ανάλυση με το Εργαλείο BISON Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Θεωρία υπολογισμού1 Μη αιτιοκρατικό αυτόματο Σ={0}, L = { 0 k : k=2m, k=3m}, μαντεύουμε το μήκος.
ΑΛΓΟΡΙΘΜΟΣ ΠΡΟΒΛΗΜΑ ΑΛΓΟΡΙΘΜΟΣ ΛΥΣΗ
Μοντελοποίηση υπολογισμού
Ενισχυτική διδασκαλία
Κεφάλαιο 4 :: Σημασιολογική Ανάλυση
Λήμμα άντλησης Πως αποφασίζουμε αποδεικνύουμε ότι μία γλώσσα δεν είναι κανονική; Δυσκολότερο από την απόδειξη ότι μια γλώσσα είναι κανονική. Γενικότερο.
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Ισοδυναμία ΠΑ - ΚΕ Για να δείξουμε ότι οι κανονικές γλώσσες - εκφράσεις και τα πεπερασμένα αυτόματα είναι ισοδύναμα σε εκφραστική δυνατότητα έχουμε να.
Ενότητα 9 : Κανονικές Εκφράσεις Αλέξανδρος Τζάλλας
Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος
Η Γλώσσα Pascal Υποπρογράμματα
Πίνακας Συμβόλων Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ Η/Υ
Μεταγλωττιστές (Compilers) (Θ)
UNIT 1 Τα Πρώτα Προγράμματα.
Μεταγράφημα παρουσίασης:

Γλώσσες Προγραμματισμού Μεταγλωττιστές Λεκτική Ανάλυση Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου

Δομή ▪Λεκτική Ανάλυση ▪Τυπικές Γλώσσες ▪Κανονικές Εκφράσεις ▪Υλοποίηση Λεκτικών Αναλυτών Γεννήτριες Λεκτικών Αναλυτών FLEX Παράδειγματα

Φάσεις Μεταγλώττισης Συντακτική Ανάλυση Λεκτική Ανάλυση Σημασιολογική Ανάλυση Παραγωγή Ενδιάμεσου Κώδικα Βελτιστοποίηση Ενδιάμεσου Κώδικα Βελτιστοποίηση Τελικού Κώδικα Παραγωγή Τελικού Κώδικα Πίνακας Συμβόλω ν Χειριστής Σφαλμάτω ν Αρχικό Πρόγραμμα λεκτικές μονάδες συντακτικό δένδρο ενδιάμεσος κώδικας τελικός κώδικας Τελικό Πρόγραμμα

Λεκτική Ανάλυση ▪Αποδοχή μιας συμβολοσειράς χαρακτήρων που αποτελούν το αρχικό πρόγραμμα και εξαγωγή των λεκτικών μονάδων (tokens). Οι λεκτικές μονάδες χρησιμοποιούνται σαν είσοδος στην φάση της συντακτικής ανάλυσης. Αποτελούν τερματικά σύμβολα της γλώσσας. ▪Υλοποιείται από τον λεκτικό αναλυτή (lexical analyser, scanner). Αποθήκευση λεκτικών μονάδων στον πίνακα συμβόλων. Ανίχνευση σφαλμάτων Διαγραφή σχολίων, διαστημάτων, κενών γραμμών.

Αλληλεπιδράσεις ΛΑ και ΣΑ Λεκτικός Αναλυτής Συντακτικός Αναλυτής Πηγαίο Πρόγραμμα Έξοδος προς Σημασιολογική Ανάλυση Πίνακας Συμβόλω ν Λεκτική Μονάδα Επόμενη Λεκτική Μονάδα Σφάλματα

Ορισμοί ▪Λεκτική Μονάδα (token) Ζεύγος αποτελούμενο από όνομα και τιμή ιδιότητας ▪Πρότυπα ή περιγραφές (pattern) Περιγραφή της μορφής που θα έχει η λεκτική μονάδα. ▪Λέξημα (lexeme) Η συγκεκριμένη ακολουθία χαρακτήρων που ικανοποιεί το πρότυπο και αποτελεί στιγμιότυπο της λεκτικής μονάδας.

Παράδειγμα

Λεκτικές Μονάδες σε μια Γλώσσα ▪Μια λεκτική μονάδα για κάθε λέξη κλειδί (keyword) ▪Λεκτικές μονάδες για κάθε τελεστή ή μια ομάδα για κάθε τελεστή (operator) ▪Μια λεκτική μονάδα για τα αναγνωριστικά (identifiers) ▪Λεκτικές Μονάδες για σταθερές (αριθμητικές, συμβολοσειρές) ▪Λεκτικές Μονάδες για συντακτικά σύμβολα (παρενθέσεις, κόμματα, κλπ)

Τιμές Ιδιοτήτων (Attribute values) ▪Πως ξεχωρίζουν τα λεξήματα που αντιστοιχούν στην ίδια λεκτική μονάδα; πχ. id <- x, rate, position number < ▪Τιμές ιδιοτήτων που περιγράφουν το λέξημα Ιδιαίτερα σημαντικό στα αναγνωριστικά (id), όπου συνήθως αποθηκεύεται ένας δείκτης στον πίνακα συμβόλων. Για τους αριθμούς μπορεί να είναι η τιμή που αντιστοιχεί στον αριθμό, ή ένας δείκτης στην συμβολοσειρά που αναπαριστά τον αριθμό.

Τιμές Ιδιοτήτων (Attribute values) II ▪Ε = Μ * C ** 2 ( id, δείκτης στον πίνακα για το Ε) ( assign_op ) ( id, δείκτης στον πίνακα για το M) ( mult_op ) ( id, δείκτης στον πίνακα για το C) ( exp_op ) ( number,2) ▪Τα ονόματα ιδιοτήτων χρησιμοποιούνται συνήθως στην φάση της συντακτικής ανάλυσης ενώ τα οι τιμές ιδιοτήτων σε μεταγενέστερες φάσεις.

Περιγραφές ▪Σε μερικές περιπτώσεις η περιγραφή των λεκτικών μονάδων είναι σχετικά απλή. ▪Σε άλλες η περιγραφή είναι περισσότερο πολύπλοκη. Πώς θα περιγραφούν τα patterns?

There is nothing more practical than a good theory. Τυπικές Γλώσσες (Formal Languages) (ή τυποκρατικές γλώσσες)

Αλφάβητο ▪Μη κενό, πεπερασμένο σύνολο από σύμβολα Σ ονομάζεται αλφάβητο. {0,1} {α,β,γ,δ...ω} {2,3,7} σύνολο ASCII χαρακτήρων ▪Συμβολοσειρά: πεπερασμένη παράθεση από σύμβολα , μεταγλωττιστές, κενή συμβολοσειρά ε ▪Μήκος της συμβολοσειράς είναι ο αριθμός των συμβόλων που περιέχει. |010111| = 6, |77733|=5

Συμβολοσειρές ▪Σ n Σύνολο συμβολοσειρών μήκους n. ▪Σ 0 ={ε}, Σ 2 ={00,01,10,11} ▪Με Σ* συμβολίζεται η ένωση όλων των Σ n ▪Με Σ + η ένωση όλων των μη-κενών συνόλων.

Παράθεση και Δυνάμεις ▪Παράθεση δύο συμβολοσειρών α και β αποτελείται από τα σύμβολα της α ακολουθούμενα από όλα τα σύμβολα της β. α=011 β=000 αβ= ▪Ύψωση σε δύναμη n είναι η παράθεση n μιας συμβολοσειράς n φορές με τον εαυτό της. α 0 = ε α n+1 = αα n

Συμβολοσειρές ▪Πρόθεμα (prefix) Η συμβολοσειρά α είναι πρόθεμα της συμβολοσειράς β εάν υπάρχει συμβολοσειρά γ τέτοια ώστε β = αγ wh while ▪Επίθεμα ή κατάληξη (suffix) Η συμβολοσειρά α είναι επίθεμα της συμβολοσειράς β εάν υπάρχει συμβολοσειρά γ τέτοια ώστε β = γα ile while ▪Υποσυμβολοσειρά (substring) Η συμβολοσειρά α είναι υποσυμβολοσειρά της συμβολοσειράς β εάν υπάρχουν συμβολοσειρές γ και δ τέτοιες ώστε β = δαγ hil while

Γλώσσες ▪Μια γλώσσα L ενός αλφαβήτου Σ είναι ένα υποσύνολο του Σ*, δηλαδή: Ένα απαριθμήσιμο σύνολο συμβολοσειρών ενός πεπερασμένου αλφάβητου. ▪Έστω το αλφάβητο Σ={a,b,c,d,e...y,z}. Παραδείγματα γλωσσών είναι: L={if} L={if, then, else, while, repeat} L={a n b 2n | n ακέραιος} H κενή γλώσσα  L = {ε} Η πλήρης γλώσσα

Πράξεις στις Γλώσσες I ▪Εφόσον οι γλώσσες είναι σύνολα, ορίζονται σε αυτές πράξεις συνόλων: ένωση, τομή, διαφορά. ▪Ένωση δύο γλωσσών L1 και L2 ▪Η παράθεση L δύο γλωσσών L1 και L2 είναι η γλώσσα που περιέχει συμβολοσειρές που είναι παραθέσεις μιας συμβολοσειράς της L1 και μιας συμβολοσειράς της L2.

Πράξεις στις Γλώσσες II ▪Παράθεση μιας γλώσσας με τον εαυτό της n φορές. L 0 ={ε} ▪Κλείσιμο Kleene (Kleene closure) μιας γλώσσας L, είναι η παράθεση με τον εαυτό της μηδέν η περισσότερες φορές. ▪Θετικό κλείσιμο Kleene είναι η παράθεση μιας γλώσσας με τον εαυτό της, μια η περισσότερες φορές.

Περιγραφή Γλωσσών ▪Έστω αλφάβητο Σ={a,b} και Σ* είναι το σύνολο των συμβολοσειρών που είναι δυνατό να παραχθούν. ▪Πώς μπορώ να περιγράψω μια γλώσσα η οποία περιέχει συμβολοσειρές με: Έχει ίδιο αριθμό a και b ; Να ξεκινά με aa και να τελειώνει με bab, με όλες τις συμβολοσειρές να έχουν μήκος > 5; Να περιέχει μόνο τα {aa, bb, ab}; ▪Πως μπορώ να υλοποιήσω ένα πρόγραμμα που να την “αναγνωρίζει”;

Υπολογίσιμες Γλώσσες ▪Γλώσσες για τις οποίες είναι δυνατό να κατασκευαστούν προγράμματα τα οποία να παίρνουν σαν είσοδο μια τυχαία συμβολοσειρά και να αποφαίνονται αν η συμβολοσειρά ανήκει στην γλώσσα. ▪Τυπικές γλώσσες ορίζονται μέσω γραμματικών και κατατάσσονται ανάλογα με την πολυπλοκότητά τους σε μια ιεραρχία.

Γραμματική ▪Σύστημα παραγωγής συμβολοσειρών G, που αποτελείται από μια τετράδα (T,N,P,S) T τερματικά σύμβολα (terminals) που αποτελούν το αλφάβητο της γλώσσας. N μη-τερματικά σύμβολα (non-terminals) P κανόνες παραγωγής (production rules) της μορφής α → β, όπου α και β  (Τ ∩ Ν)* S αρχικό σύνολο, το οποίο είναι στοιχείο το Ν (start symbol)

Πως παράγεται μια συμβολοσειρά; ▪Η διαδικασία αρχίζει με το αρχικό σύμβολο. ▪Αντικαθιστούμε μια υποσυμβολοσειρά α της τρέχουσας δ με την β εάν υπάρχει κανόνας παραγωγής α  β Αν δ = γαγ' τότε από γαγ' -> γβγ' ▪Όταν η συμβολοσειρά περιέχει μόνο τερματικά σύμβολα, λέμε ότι αυτή παράγεται από την γραμματική.

ΠαράδειγμαI ▪Έστω η γραμματική Τ = {a,b} N = {I,S,U} P = {I  aSb, S  e S  aS, S  bS} S = I Ι  aSb  ab (παραγωγή) Ι  aSb  abSb  abaSb  ababb

Παράδειγμα II ▪Έστω η γραμματική Τ = {0,1-9,.,e} N = {Ν,D,Ds,E} P = {Ν  DsE, D  0, D  1, D  2, D  3,...,D  9 Ds  DDs, Ds  D, E  eDs, E  ε} S = Ν Ν  2DsE  24E  24 (παραγωγή) N  4DsE  45E  45eDs  45e6  45e6

Μερικοί Ορισμοί ▪Συμβολοσειρά α  Τ* παράγεται από την G όταν υπάρχει μια ακολουθία παραγωγών τέτοια ώστε α 1 = S α n = α και ισχύει α i  α i+1 για κάθε i, 0 < i < n ▪Μεταβατικό κλείσιμο α  + β ▪Ανακλαστικό – Μεταβατικό κλείσιμο α  * β ▪Η γραμματική G παράγει την γλώσσα L(G), για την οποία L(G) = {α  T* | S  + α}

Ιεραρχία Chomsky ▪Γραμματικές τύπου 0. ▪Γραμματικές τύπου 1 (γραμματικές με συμφραζόμενα – context sensitive grammars) ▪Γραμματικές τύπου 2 (γραμματικές χωρίς συμφραζόμενα – context free grammars) ▪Γραμματικές τύπου 3 (κανονικές γραμματικές – regular grammars)

Ιεραρχία Chomsky ▪Γραμματικές τύπου 0. Όλες οι γραμματικές χωρίς περιορισμούς. ▪Γραμματικές τύπου 1 (γραμματικές με συμφραζόμενα – context sensitive grammars) Γραμματικές της μορφής α  β, έτσι ώστε η συμβολοσειρά α να περιέχει τουλάχιστον ένα μη-τερματικό σύμβολο και |α|  |β|.

Ιεραρχία Chomsky ▪Γραμματικές τύπου 2 (γραμματικές χωρίς συμφραζόμενα – context free grammars) Οι κανόνες παραγωγής έχουν μορφή α  β, όπου η συμβολοσειρά α αποτελείται από ένα μη-τερματικό σύμβολο και η β είναι συμβολοσειρά. ▪Γραμματικές τύπου 3 (κανονικές γραμματικές – regular grammars) Οι κανόνες παραγωγής έχουν την μορφή Α  aΒ Α  aΑ  ε A,B μη τερματικά και a τερματικό.

Αναγνωριστές ▪Μια αφηρημένη μηχανή που δέχεται ως είσοδο μια συμβολοσειρά ενός αλφαβήτου και δίνει έξοδο “ναι” ή “όχι”. Αναφέρονται και ως αυτόματα. ▪Μηχανή 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 είναι κανονικές εκφράσεις.

Παραδείγματα ▪(a|b) ▪(a|b)(a|b) ▪(ab)* ▪(a|b)* ▪a(a|b)*b {a,b} {aa,ab,ba,bb} {ε,ab,abab,ababab} {ε,a,b,aa,ab,bb,ba,...} {ab,aab,abb,aaab,...} ▪Έστω το Σ = {a,b}. Ποιες είναι οι γλώσσες που παράγουν οι ακόλουθες κανονικές εκφράσεις:

Επέκταση Κανονικών Εκφράσεων ▪Θετικό κλείσιμο Kleene r+ = rr* Έκφραση εμφανίζεται μία η περισσότερες φορές ▪Μηδέν ή μια εμφανίσεις της r r? = r|ε ▪Κλάσεις χαρακτήρων[a,b,c]=a|b|c ▪Διαστήματα χαρακτήρων[a-z]=a|b|...|z ▪Ειδικό σύμβολο για οποιονδήποτε χαρακτήρα Συνήθως είναι η τελεία ▪Ειδικοί χαρακτήρες παριστάνονται με το σύμβολο \ να προηγείται.\) \( \[

Απαλοιφή Παρενθέσεων ▪Προτεραιότητα τελεστών Κλείσιμο Kleene Παράθεση Διάζευξη ▪Δηλαδή η έκφραση a|b*c ισοδυναμεί με (a) | ((b)*(c)). ▪Μορφή των μη-προσημασμένων σταθερών κινητής υποσδιαστολής. πχ. 123, 1, 0.12, 1.2, 1.34Ε+23, 156e-34 ([1-9][0-9]*|0)(\.[0-9]+)?((E|e)(+|-)?[0-9]+)?

Κανονικοί Ορισμοί ▪Ακολουθία από κανόνες της μορφής d i  r i όπου Κάθε d i είναι ένα νέο σύμβολο που δεν υπάρχει στο αρχικό αλφάβητο Σ Κάθε r i είναι μια κανονική έκφραση που ορίζεται στο αλφάβητο Σ  r i-1 ▫ Για να χρησιμοποιηθεί ένας κανονικός ορισμός σε ένα άλλο θα πρέπει να έχει δηλωθεί πριν από αυτόν. (ΔΕΝ επιτρέπεται αναδρομή).

Αριθμοί Κινητής Υποδιαστολής nzdigit -> 1|2|...|9 digits -> (nzdigit|0)+ optFr -> (\.digits)? optExp -> ((E|e) (+|-)? digits)? number -> (nzdigit digits*|0) optFr optExp

Μη κανονικές Γλώσσες ▪Υπάρχουν γλώσσες οι οποίες δεν είναι κανονικές, δηλαδή δεν υπάρχει κανονική έκφραση (ή πεπερασμένο αυτόματο) που να μπορεί να τις περιγράψει. Για παράδειγμα {( n ) n : n>=0} ▪Περιγραφή και χειρισμός των γλωσσών χρησιμοποιώντας γραμματικές χωρίς συμφραζόμενα (context free grammars).

Μεταγλωττιστές Υλοποίηση Λεκτικών Αναλυτών

▪Υπάρχουν δύο προσεγγίσεις στην υλοποίηση λεκτικών αναλυτών Με την χρήση μιας γεννήτριας λεκτικών αναλυτών (π.χ. Flex) “Χειρωνακτική” υλοποίηση που περιλαμβάνει την χρήση ρουτινών Ι/Ο μιας γλώσσας (C,C++,JAVA) για την λεκτική ανάλυση. ▫ Σχεδίαση και Υλοποίηση Πεπερασμένων αυτομάτων που αντιστοιχούν στις κανονικές εκφράσεις της γλώσσας.

Γεννήτριες Λεκτικών Αναλυτών ▪Ορισμός αναγνωριστικών με κανονικές εκφράσεις. ▪Αυτόματη μετάφραση Κ.Ε. σε πεπερασμένα αυτόματα/διαγράμματα μετάβασης. ▪Χρήση πεπερασμένων αυτόματων/διαγραμμάτων για τη δημιουργία κώδικα λεξικής ανάλυσης (αυτόματα).

Flex ▪Ο Flex είναι μια γεννήτρια λεξικογραφικών αναλυτών για C/C++ ▪Υλοποίηση του «κλασσικού» Lex του Unix ▪Παράγει γρήγορους λεξικογραφικούς αναλυτές Flex := Fast Lexical Analyzer Generator ▪Υπάρχουν εκδόσεις για όλα τα λειτουργικά συστήματα (link για download από την σελίδα του μαθήματος)

Κανονικές Εκφράσεις FLEX (ι) ▪Οι κανονικές εκφράσεις (regular expressions) που υποστηρίζονται από το FLEX είναι: ▪x : ο χαρακτήρας `x` ▪. : οποιοσδήποτε χαρακτήρας εκτός του newline ▪“abc”: η ακολουθία χαρακτήρων abc ▪[xyz] : οποιοσδήποτε από τους χαρακτήρες x ή y ή z ▪[a-z] : οποιοσδήποτε χαρακτήρας από a εως z ▪[^a-z] : οποιοσδήποτε χαρακτήρας εκτός από a εως z

Κανονικές Εκφράσεις FLEX (ιι) ▪r* : καμία ή περισσότερες επαναλήψεις της κανονικής έκφρασης r ▪r+ : μία ή περισσότερες επαναλήψεις της r ▪r? : μία ή καμία επανάληψη της r ▪r{i,j} : (0<i<j) από i εως j επαναλήψεις της r π.χ. η.{3,4} περιγράφει λέξεις 3 ή 4 χαρακτήρων ▪rs : ακολουθίες που προκύπτουν από την παράθεση των r και s ▪(r) : οι παρενθέσεις ορίζουν την εφαρμογή των τελεστών ▪r|s : ακολουθίες που ικανοποιούν ή την r ή την s

Κανονικές Εκφράσεις FLEX (ιιι) ▪^r : ικανοποιείται μόνο αν η ακολουθία βρίσκεται στην αρχή της γραμμής ▪r$ : ικανοποιείται μόνο αν η ακολουθία βρίσκεται στο τέλος της γραμμής ▪\\, \”, \(, \), \*, \+, \[, \], \$, \^, \{, \} : οι ίδιοι οι χαρακτήρες \, ”, (, ), *, +, [, ], $, ^, { και }

Δομή Προγράμματος Flex ▪Ένα αρχείο flex αποτελείται από 3 μέρη που διαχωρίζονται από `%` Κανονικοί Ορισμοί και δηλώσεις % Κανόνες % Κώδικας Χρήστη (Βοηθητικές Συναρτήσεις)

Κανονικοί Ορισμοί & Δηλώσεις ▪Οι ορισμοί αποτελούνται από: κανονικούς ορισμούς που έχουν την μορφή: name regular expression digit[0-9] id[a-zA-Z][a-zA-Z_0-9]* κώδικα που θέλουμε να συμπεριληφθεί στον παραγώμενο λεξικό αναλυτή (συνήθως δηλώσεις μακροεντολών, μεταβλητών και τύπων δεδομένων) ανάμεσα σε “%{“…”}%” %{ #include #define TK_IF 0 #define TK_ELSE 1 }%

Κανόνες ▪Το τμήμα κανόνων είναι το κύριο τμήμα του προγράμματος και αποτελείται από κανόνες της μορφής: pattern1 {action1} pattern2 {action2} pattern3 {action3} ▪pattern = κανονική έκφραση ▪Για παράδειγμα: % {id}{printf(“Found id: %s\n”,yytext) {digit} {printf(“Found digit: %s\n”, yytext); %

Κώδικας Χρήστη και Βοηθητικές Συναρτήσεις ▪Στο τελευταίο μέρος της περιγραφής του λεξικού αναλυτή περιλαμβάνονται οι όποιες συναρτήσεις καλούνται από το δεύτερο μέρος και δεν ορίζονται αλλού. ▪Αν θέλουμε το αποτέλεσμα της επεξεργασίας της γεννήτριας να λειτουργεί ως αυτόνομο πρόγραμμα, τότε στο μέρος αυτό περιλαμβάνεται και η συνάρτηση main(). Διαφορετικά ο παραγόμενος κώδικας θα χρησιμοποιηθεί στο πλαίσιο ενός άλλου προγράμματος. ▪Το τμήμα κώδικα χρήστη είναι προαιρετικό και ο κώδικας αντιγράφεται χωρίς αλλαγές στο παραγώμενο αρχείο.

Λειτουργία ▪Όταν ικανοποιείται ένα pattern, ο κανόνας ενεργοποιείται και ο κώδικας που ακολουθεί εκτελείται. ▪Όταν ικανοποιούνται περισσότεροι από ένας κανόνες τότε επιλέγεται αυτός που καταναλώνει περισσότερους χαρακτήρες. Εάν καταναλώνουν τον ίδιο αριθμό επιλέγεται αυτός που έχει δηλωθεί πρώτος.

Σημαντικές Μεταβλητές/Συναρτήσεις Flex (i) ▪char *yytext: περιέχει το κομμάτι του κειμένου που έχει ικανοποιήσει την κανονική έκφραση (lexeme) ▪int yyleng: ένας ακέραιος που δηλώνει το μέγεθος του yytext ▪int yylex() : Η παραγόμενη συνάρτηση λεξικής ανάλυσης. Επιστρέφει το αναγνωριστικό της λεξικής μονάδας, που διαβάζει.

Σημαντικές Μεταβλητές/Συναρτήσεις Flex (ii) ▪YYTYPE yylval :Η μεταβλητή μέσω της οποίας επικοινωνεί ο λεξικός αναλυτής με το συντακτικό αναλυτή. Ο προκαθορισμένος τύπος YYTYPE είναι int, αλλά ο χρήστης μπορεί να τον ορίσει σύμφωνα με τις ανάγκες του στο πρώτο μέρος της περιγραφής του λεξικού ή του συντακτικού αναλυτή. Η τιμή της μεταβλητής yylval, πρέπει να ενημερώνεται, όποτε αυτή χρειάζεται, στα τμήματα κώδικα action του δευτέρου μέρους της. ▪Η εντολή return επιστρέφει στο συντακτικό αναλυτή το αναγνωριστικό της τελευταίας λεξικής μονάδας, που αναγνωρίσθηκε.

Ένα Απλό Παράδειγμα %{ #include int lineno = 1; %} line.*\n % {line} {printf("%5d %s", lineno++, yytext);} % int main() { yylex(); }

Διαδικασία Δημιουργίας ΛΑ C compiler a.out FLex compiler Flex Source Program (test.l) lex.yy.c (lexyy.c) a.out Input Stream Sequence of Tokens lex.yy.c (lexyy.c)

Διαδικασία Δημιουργίας ΛΑ (ιι) ▪Το αρχείο περιγραφής (test.l) διοχετεύεται ως είσοδος στη γεννήτρια κώδικα λεξικής ανάλυσης. flex test.l ▪Ο κώδικας που προκύπτει ως αποτέλεσμα περιλαμβάνεται στο αρχείο lex.yy.c (lexyy.c)και περιλαμβάνει σίγουρα τη συνάρτηση λεξικής ανάλυσης yylex(). ▪Αν το αρχείο περιγραφής περιλαμβάνει συνάρτηση main(), τότε το πρόγραμμα που παράχθηκε μπορεί να λειτουργήσει αυτόνομα και για να γίνει αυτό πρέπει να περάσει από ένα μεταγλωττιστή της C. gcc lex.yy.c -lfl ▪Αν όχι, τότε για να χρησιμοποιηθεί ο παραγόμενος κώδικας στο πλαίσιο ενός άλλου προγράμματος (μεταγλωττιστής) χρειάζεται να συμπεριληφθεί με την οδηγία #include “lex.yy.c”

Παράδειγμα 2 - #define % { #define T_IF 250 #define T_THEN #define GTE 1100 #include... int idnum=0;... %}

Παράδειγμα 2 Κανονικοί Ορισμοί ws [ \n\t]+ nzdigit [1-9] digit (0|{nzdigit}) digits {digit}+ optFr (\.{digits})? optExp ((E|e)(\+|-)?{digits})? number ({nzdigit}{digits}*|0){optFr}{optExp} letter [A-Za-z] id {letter}({letter}|{digit})* %

Παράδειγμα 2 Κανόνες % {ws} {/* do nothing */} if {attr=0;return(T_IF);} then {attr=0;return(T_THEN);} else {attr=0;return(T_ELSE);} {number} {attr=atoi(yytext); return(T_NUM);} {id} {attr=idnum++; return(T_ID);} ">=" {attr=GTE;return(T_RELOP);} "=" {attr=EQ;return(T_RELOP);} "=<" {attr=LTE;return(T_RELOP);}. {printf("Error in %s \n",yytext);return(ERROR);} %

Παράδειγμα 2 Κώδικας Χρήστη % int main() { int token; while ((token=yylex()) != 0) {printf("%s \n",yytext,token,attr);} }

Σύνοψη ▪Λεκτική Ανάλυση ▪Τυπικές Γλώσσες ▪Κανονικές Εκφράσεις ▪Υλοποίηση Λεκτικών Αναλυτών Γεννήτριες Λεκτικών Αναλυτών FLEX Παράδειγματα ▪Επόμενο Μάθημα: Κανονικές εκφράσεις και Πεπερασμένα Αυτόματα. Διαγράμματα Μετάβασης.