Εργαστήριο 3 Εισαγωγή στο Flex Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Σχετικά έγγραφα
Εισαγωγή στο Flex. Μεταγλωττιστές, Χειμερινό εξάμηνο

Σχεδίαση Γλωσσών Προγραμματισμού. Εαρινό Εξάμηνο Lec04 19/02/2019

Τι είναι το Flex. Περιγραφή ενός λεξικογραφικού αναλυτή στη γλώσσα του lex/flex. Γενικά Χαρακτηριστικά του Flex

HY340, 2009 Α. Σαββίδης Slide 2 / 26. HY340, 2009 Α. Σαββίδης Slide 3 / 26. HY340, 2009 Α. Σαββίδης Slide 4 / 26

Φροντιστήριο 1ο Εισαγωγή στο FLEX. Flex. Regular Expressions (1/4)

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Μεταγλωττιστές. Εργαστήριο 5. Εισαγωγή στο BISON. Γεννήτρια Συντακτικών Αναλυτών. 2 η Φάση Μεταγλώττισης Συντακτική Ανάλυση

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Παρουσίαση του εργαλείου FLEX

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Λεκτική Ανάλυση

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην εξοικείωση με τη διαδικασία κατασκευής ενός Λεξικού Αναλυτή κάνοντας χρήση του lex.

Υλοποίηση ΛΑ με το flex

Παρουσίαση του εργαλείου. flex. γεννήτρια λεκτικών αναλυτών. για το µάθηµα: Μεταγλωττιστές. Χανιά, flex 1

Εργαστήριο 4_1 Λεκτική Ανάλυση - Flex Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Υλοποίηση ΣΑ με το bison

Υλοποίηση ΣΑ με το bison

Παρουσίαση του εργαλείου BISON

Εργαστήριο 08 Εισαγωγή στo Yacc

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

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στις βασικές έννοιες που σχετίζονται με τη λεξική ανάλυση. Στη δήλωση ορισμό κανονικών εκφράσεων

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Δομημένος Προγραμματισμός (ΤΛ1006)

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Παρουσίαση του εργαλείου BISON

Θα χρησιμοποιήσουμε το bison, μια βελτιωμένη έκδοση του yacc. Φροντιστήριο 2ο Εισαγωγή στο YACC. Yacc. Δομή Προγράμματος Yacc

Λεκτικός Αναλυτής. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Κεφάλαιο 2: Τυπικές γλώσσες. Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος / 216

Η γλώσσα προγραμματισμού C

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Κανονικές εκφράσεις ή παραστάσεις (Regular Expressions) 3 ο Εργαστήριο ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - ΕΡΓΑΣΤΗΡΙΟ

HY340, 2010 Α. Σαββίδης. Slide 3 / 43. Slide 4 / 43

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

Εργασία Προγραµµατισµού

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Λογισμικό Συστήματος. Κλειώ Σγουροπούλου

Δομημένος Προγραμματισμός

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Εργασία Προγραµµατισµού

ΚΕΦΑΛΑΙΟ 6: Γλώσσες. 6.1 Ιστορική εξέλιξη 6.4 Υλοποίηση γλώσσας. Κεφάλαιο 6: «Γλώσσες Προγραµµατισµού»

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Προγραμματισμός Ι (ΗΥ120)

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 3 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

(Regular Expressions) ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ/ ΧΕΙΜ

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

Προεπεξεργαστής της C. C Preprocessor. Προγραμματισμός II 1

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 1 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Εργαστήριο 08 Δημιουργία 1 ου Συντακτικού Αναλυτή

Σχεδίαση Γλωσσών Προγραμματισμού Λεξική Ανάλυση Ι. Εαρινό Εξάμηνο Lec 05 & & 26 /02/2019 Διδάσκων: Γεώργιος Χρ.

Τι είναι το yacc. Δομή ενός αρχείου yacc. Πρόλογος. ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο. Ο yacc είναι ένας γενικού σκοπού parser generator.

ΘΠ06 Μεταγλωττιστές. Εργασία Εξαμήνου: Υλοποίηση ενός Μεταγλωττιστή για τη Γλώσσα Floop2009

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Σημασιολογική Ανάλυση

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην αναγκαιότητα ύπαρξης των μεταγλωττιστών

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Εισαγωγή στα Λειτουργικά Συστήματα

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

Δομημένος Προγραμματισμός

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Προγραμματισμός I (Θ)

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών & Μηχανικών Υπολογιστών Τομέας Πληροφορικής

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

Δομημένος Προγραμματισμός (ΤΛ1006)

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Κεφάλαιο 2: Μεταφραστές

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στην γλώσσα προγραμματισμού C

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Εισαγωγή στη γλώσσα προγραμματισμού C++

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος Λεκτική Ανάλυση. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Γλώσσα Προγραμματισμού C

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

Γλωσσική Τεχνολογία. String Handling Regular Expressions

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340

Στοιχειώδης προγραμματισμός σε C++

Transcript:

Μεταγλωττιστές Εργαστήριο 3 Εισαγωγή στο Flex Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι 2015-1016

Μεταγλωττιστής (compiler - μεταφραστής) είναι ένα πρόγραμμα που μεταφράζει άλλα προγράμματα, που είναι γραμμένα σε μια γλώσσα πηγής (source language), σε μια ισοδύναμη γλώσσα στόχο (object language). Μεταγλωττιστής (compiler): Η γλώσσα πηγής είναι συνήθως μια γλώσσα προγραμματισμού υψηλού επιπέδου ενώ η γλώσσα στόχος είναι συχνότερα η γλώσσα μηχανής ενός υπολογιστή. Πιο συγκεκριμένα ο μεταφραστής (translator) προσδιορίζει την σημασιολογία της γλώσσας προγραμματισμού, μετατρέπει τις λειτουργίες που είναι καθορισμένες από την σύνταξη σε λειτουργίες του υπολογιστικού μοντέλου κάποιας πραγματικής ή εικονικής μηχανής.

Φάσεις Μεταγλώττισης Ένας τυπικός μεταγλωττιστής συνίσταται από αρκετές φάσεις η καθεμία από τις οποίες περνά την έξοδό (output) της στην επόμενή της φάση : Η Λεξική Ανάλυση (lexical analysis) ομαδοποιεί τους χαρακτήρες σε λεξικές μονάδες (lexical units) ή αναγνωριστικά (tokens). Η είσοδος (input) σε αυτήν την φάση είναι ένα ρεύμα χαρακτήρων (character stream). Η έξοδος είναι ένα ρεύμα αναγνωριστικών (stream of tokens). Οι κανονικές εκφράσεις (regular expressions) χρησιμοποιούνται για να προσδιορίσουν τα αναγνωριστικά που προέκυψαν από τον λεξικό αναλυτή. Ο λεξικός αναλυτής ή αλλιώς σαρωτής (scanner) λειτουργεί ως μηχανή πεπερασμένων καταστάσεων. Παράδειγμα εργαλείων για την δημιουργία λεξικών αναλυτών είναι τα Lex και Flex. Τα προγράμματα αυτά αναγνωρίζουν λεξικά πρότυπα (ή δείγματα) μέσα σε κείμενο. Στην Συντακτική Ανάλυση (syntax analysis or parse) ομαδοποιούνται τα αναγνωριστικά σε συντακτικές μονάδες (syntactical units). Η έξοδος σε αυτή την φάση είναι μια δενδρική αναπαράσταση της σύνταξης του προγράμματος. Το δένδρο χρησιμοποιεί φυσική γλώσσα και καθορίζει την δομή του προγράμματος που αναγνωρίστηκε απ τον συντακτικό αναλυτή. Κατά την Σημασιολογική Ανάλυση (semantic analysis) αναλύεται το συντακτικό δένδρο έτσι ώστε να εντοπιστούν οι πληροφορίες που δεν μπορούν να καθοριστούν πλήρως απ την συντακτική ανάλυση. Οι πληροφορίες αυτές συγκροτούν την στατική σημασία (static semantics) του προγράμματος. Η έξοδος της φάσης αυτής είναι ένα συντακτικό δένδρο με σχόλια. Χαρακτηριστική γραμματική χρησιμοποιείται για να γίνει κατανοητή η στατική σημασία του προγράμματος.

Φάσεις Μεταγλώττισης Κατά την Βελτιστοποίηση (optimizing) εφαρμόζονται σημασιολογικές μετατροπές στο προαναφερθέν σχολιασμένο δένδρο για να απλοποιηθεί η δομή του και για να διευκολυνθεί η παραγωγή πιο αποδοτικού κώδικα. Στην φάση της Δημιουργίας του Κώδικα (code generating) μετατρέπεται το απλοποιημένο πλέον δένδρο σε κώδικα γραμμένο στην γλώσσα στόχο χρησιμοποιώντας κανόνες που υποδηλώνουν την σημασία της γλώσσας πηγής. Κατά την Βελτιστοποίηση του Τελικού Προγράμματος (peer-hole optimizing) εξετάζεται ο κώδικας (της γλώσσας στόχου) και επιχειρούνται βελτιώσεις πάνω στον εξαρτώμενο από την μηχανή κώδικα.

FLEX/BISON στο flowchart ενός compiler Lexer/Scanner Flex (αρχείο.l ) Parser Bison (αρχείο.y ) Frontend Semantic Analyzer Optimizers Middle-end Code Generator Backend

Τι είναι το Flex Μετα-εργαλείο παραγωγής λεκτικών αναλυτών. Μία γεννήτρια λεξικογραφικών αναλυτών Open source: Υπάρχει για όλα τα διαδεδομένα λειτουργικά συστήματα (πχ. GNU/Linux, Solaris, Mac OS- X, Win32) Παράγει πολύ γρήγορους λεξικογραφικούς αναλυτές Παράγει λεξικογραφικούς αναλυτές για γλώσσες C/C++ (target language) http://gnuwin32.sourceforge.net/packages/flex.htm Manual: http://www.gnu.org/software/flex/manual/ Flex σημαίνει Fast - Lexical Analyzer

Λεκτική Ανάλυση Αποτελεί την πρώτη φάση της μετάφρασης. Αναγνώριση λεκτικών μονάδων ενός προγράμματος. Απόκρυψη των περιττών λεπτομερειών από τον συντακτικό αναλυτή. Που βοηθάει το Flex? Εργαλείο κατασκευής λεκτικού αναλυτή. Αναγνωρίζει λεκτικές μονάδες από ένα αρχείο. Δυνατότητα επιστροφής τιμών για κάθε λεκτική μονάδα.

Παράδειγμα Λεκτικής Ανάλυσης Μετατροπής μιας έκφρασης από χαρακτήρες σε μια σειρά από tokens. foo = 1-3**2 Lex Token type Foo Variable = Assignment operator 1 Number - Subtraction operator 3 Number ** Power operator 2 Number

Περιγραφή ενός λεξικογραφικού αναλυτή στη γλώσσα του lex/flex (Λειτουργία του Flex) Για την περιγραφή ενός λεξικογραφικού αναλυτή στο flex/lex, χρησιμοποιούνται Κανονικές εκφράσεις (regular expressions ή regex): που περιγράφουν τα λεξικογραφικά πρότυπα μιας γλώσσας Ενέργειες (Actions): δηλαδή κώδικας σε μία γλώσσα προγραμματισμού που εκτελείται όταν αναγνωριστεί μια κανονική έκφραση (στην οποία αντιστοιχεί το action)

Δομή Αρχείου Εισόδου (αρχείο.l) Το αρχείο εισόδου στο Flex αποτελείται από 3 μέρη. Ορισμοί. Κανόνες. Συναρτήσεις. /*(τμήμα ορισμών) Statements block*/ %% /*(τμήμα κανόνων) Rules block*/ %% /*(συναρτήσεις χρήστη) User Functions*/ (Προαιρετικό)

Τμήμα Ορισμών Το τμήμα ορισμών περιλαμβάνει: Επιλογές του εργαλείου: %option option_name ή %option option_name=value %option noyywrap //tells Flex to read only one input file %option case-insensitive //distinguish between uppercase (capital) and lowercase (small) letters Δηλώσεις αρχικών καταστάσεων για Κανονικές Εκφράσεις (Κ.Ε.). %x STATE_COMMENT Ορισμός αναγνωριστικών Ανάθεση ονομάτων σε σύνολα από αναγνωριστικά Letterdigit [A-Za-z0-9] Whitechar [\t\n] Literal blocks περικλείεται μέσα σε %{ code %} και περιέχει κώδικα C. Header file inclusion. Define constants and global variables

Τμήμα Κανόνων Περιλαμβάνει τις κανονικές εκφράσεις και τους διάφορους κανόνες. Μορφή κανόνων: Κανονική έκφραση {C code} 0 ( -?[1-9][0-9]*) {return (INTEGER);} Κώδικας εντός των %{..%} αντιγράφεται αυτούσιος. ΠΡΟΣΟΧΗ!!! To Flex θα χρησιμοποιήσει το πρώτο κανόνα που κάνει match σε περίπτωση σύγκρουσης.

Παραδείγματα [0-9]+ { printf( An integer %s \n, yytext); } [a-z][a-z0-9]* { printf( An identifier %s \n, yytext);} if then begin end function { printf( A Keyword %s \n, yytext); }

Τμήμα Συναρτήσεων Χρήστη Περιλαμβάνει τις οριζόμενες από τον χρήστη συναρτήσεις. Παραδείγματα: main() yyerror() yywrap() Ουσιαστικά δημιουργούμε όποια συνάρτηση θέλουμε εμείς για να επεξεργαστούμε τυχόν δεδομένα.

Ειδικοί Χαρακτήρες Χαρακτήρας Λειτουργία - Περιγραφή. Οποιοσδήποτε χαρακτήρας εκτός του \n [ ] Κλάσεις χαρακτήρων, π.χ. [a-z],[0-9] ^ Αναγνώριση της αρχής μίας γραμμής $ Αναγνώριση του τέλους μια γραμμής { } Πλήθος εμφανίσεων ή αναφορά σε ένα pattern \ Escape sequence όπως στη C * Μηδέν ή περισσότερες εμφανίσεις της Κ.Ε. που προηγείται + Μία ή περισσότερες εμφανίσεις της Κ.Ε. που προηγείται? Μηδέν ή μία εμφάνιση της Κ.Ε. που προηγείται Τελεστής διάζευξης Αναγνώριση κυριολεκτικών ( ) Ομαδοποίηση Κ.Ε. / Αναγνώριση βασισμένη σε συμφραζόμενα π.χ. (ab/cd Αναγνωρίζει το ab στο abcd) <<EOF>> Αναγνώριση τέλους αρχείου

Χρήσιμες Μεταβλητές YYSTYPE yylval: Είναι ίσως η σημαντικότερη μεταβλητή, καθώς χρησιμοποιείται για επικοινωνία του λεκτικού με τον συντακτικό αναλυτή. Περιέχει την τιμή που θα περαστεί στον συντακτικό αναλυτή. Μπορεί να περιέχει πολλαπλά πεδία αν ξαναοριστεί ως union τύπου YYSTYPE στο τμήμα ορισμών του αρχείου. int yyleng: Περιέχει το μήκος της αναγνωρισθείσας λεκτικής μονάδας. char *yytext: Περιέχει την αναγνωρισθείσα λεκτική μονάδα.

Χρήσιμες Συναρτήσεις yylex(): yymore(): yyless(int n): yywrap(): Yytext: Yyleng: Καλείται για την αναγνώριση της επόμενης λεκτικής μονάδας. Ενσωματώνει την επόμενη λεκτική μονάδα στην τρέχουσα Κρατάει τους n χαρακτήρες του λεκτικού και επιστρέφει τους υπόλοιπους Καθορίζει την λειτουργία του λεκτικού αναλυτή. Καλείται αυτόματα και μπορεί να επιστρέψει την αναγνώριση πολλαπλών αρχείων. Η συμβολοσειρά που έχει αναγνωριστεί Το μήκος της συμβολοσειράς

%{ int linecount = 0; %} Digit [0-9] Identifier [a-za-z]{a-za-z0-9}* %% {Identifier} { printf( %s: This is an identifier\n, yytext); } \n { printf( The line number is %d\n, ++linecount); } [\t ]+ ; /*Ignore spaces */. { printf( Unrecognized character\n ); } %% main() { yylex(); } Ορισμοί Συναρτήσεις Χρήστη Κανόνες Παράδειγμα: count lines CountLine.l

Παράδειγμα: Line/word counter int lines=0, chars=0; %% \n ++lines; ++chars;. ++chars; %% main() { yylex(); printf( lines: %d chars: %d\n, lines, chars); }

Παράδειγμα: remove comments %x comment %% "/*" BEGIN(comment); <comment>[^*\n]* /* eat anything that's not a '*' */ <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ <comment>\n ; <comment>"*"+"/" BEGIN(0); %%

Εκτέλεση Flex Όνομα αρχείου file_name.l Εντολή flex file_name.l Compile του παραγόμενου αρχείου για παραγωγή εκτελέσιμου: Παράγεται το αρχείο lex.yy.c Override με o Output_File Με gcc (CodeBlocks) Mε gcc και σύνδεση με την βιβλιοθήλη libfl: gcc lex.yy.c o lexer_name -lfl Εκτέλεση λεκτικού αναλυτή:./lexer_name input_file_name Debugging: Χρήση της printf για να επιστρέψει τη αναγνωρίζει το Flex.

Flex Source File (sample.l) Flex Compiler (Flex) Lexical Analyzer Code (lex.yy.c) C Compiler Input Text File Lexical Analyzer executable Output: Tokens Parser

Κανονικές Εκφράσεις (1) x αναγνωρίζει τον χαρακτήρα x και μόνο αυτόν abcd... αναγνωρίζει την ακολουθία χαρακτήρων abcd.... (τελεία) αναγνωρίζει οποιονδήποτε χαρακτήρα ή σύμβολο πλην του newline [xyz] αναγνωρίζει ένα οποιονδήποτε από τους χαρακτήρες που βρίσκονται μέσα στο σύνολο. Δηλαδή ή το x ή το y ή το z

Κανονικές Εκφράσεις (2) [ab-e] αναγνωρίζει τους χαρακτήρες a ή b ή c ή d ή e. [^ab-e] Όταν το σύμβολο ^ εμφανίζεται στην αρχή του συνόλου σημαίνει την ΑΡΝΗΣΗ του συνόλου. Δηλαδή ο συμβολισμός ab-e δημιουργεί μία ακολουθία χαρακτήρων που ξεκινούν από το b και καταλήγουν στο e σύμφωνα με το ascii char set. Δηλαδή το παραπάνω αναγνωρίζει ΟΛΟΥΣ τους χαρακτήρες, εκτός από τους a, b, c, d, e.

Κανονικές Εκφράσεις (3) r* kleen star, αναγνωρίζει καμία ή περισσότερες επαναλήψεις της κανονικής έκφρασης r r+ αναγνωρίζει μία ή περισσότερες επαναλήψεις της κανονικής έκφρασης r Παράδειγμα η a* περιγράφει τα ε, a, aa, aaaa, aaaaaaaa,... η [ab-e]* περιγράφει τα ε, a, c, ac, cab, bbbe, cbaead παράδειγμα η a+ περιγράφει τα a, aa, aaaa, αλλά όχι το ε η [ab-e]+ περιγράφει τα a, c, ac, cab, bbbe, cbaead

Κανονικές Εκφράσεις (4) r? αναγνωρίζει μία ή καμία επανάληψη της κανονικής έκφρασης r (διαβάζεται ως προαιρετικό r) r{i, j} όπου 0 < i < j αναγνωρίζει i, i+1, i+2,..., j-1, j επαναλήψεις της κανονικής έκφρασης r r{i,} όπου 0 < i αναγνωρίζει i ή περισσότερες επαναλήψεις της κανονικής έκφρασης r παράδειγμα η.{2, 3} περιγράφει τις λέξεις που αποτελούνται από 2 ή 3 χαρακτήρες, πχ. ant, ///,..., 3/2, 23, 2b, or, not,...

Κανονικές Εκφράσεις (5) r{i} όπου 0 < i αναγνωρίζει i ακριβώς επαναλήψεις της κανονικής έκφρασης r rs αναγνωρίζει τις ακολουθίες που αναγνωρίζει η συνένωση των κανονικών εκφράσεων r και s (concatenation) παράδειγμα Η abc αναγνωρίζει την abc H [a-z] foo [1-3] αναγνωρίζει όλες τις λέξεις 5 χαρακτήρων που ξεκινούν με πεζό γράμμα, περιέχουν το string foo και τελειώνουν με έναν αριθμό από το 1 μέχρι το 3, πχ. afoo1, lfoo3,...

Κανονικές Εκφράσεις (6) (r) οι παρενθέσεις γύρω από μία κανονική έκφραση r, απλώς αλλάζουν την προτεραιότητα εφαρμογής των τελεστών r s ικανοποιείται από τις ακολουθίες συμβόλων που ικανοποιούν την r ή τις ακολουθίες που ικανοποιούν την s όχι και τις δύο (xor). παράδειγμα Η abc+ αναγνωρίζει τις abc, abcc, abcccccc,... Ενώ η (abc)+ αναγνωρίζει τις abc, abcabc,... Επίσης η abc + αναγνωρίζει τις ίδιες ακολουθίες χαρακτήρων που αναγνωρίζει και η (abc)+ παράδειγμα Η ( abc ABC ){2,3} αναγνωρίζει τις abcabc, abcabc, ABCABC, abcabcabc,...

Κανονικές Εκφράσεις (7) ^r ικανοποιείται όταν ικανοποιείται η r και η ακολουθία που την ικανοποιεί βρίσκεται στην αρχή της γραμμής r$ ικανοποιείται όταν ικανοποιείται η r και η ακολουθία που την ικανοποιεί βρίσκεται στο τέλος της γραμμής

Κανονικές Εκφράσεις (8) \\, \, \(, \), \*, \+, \[, \], \$, \^, \{, \},... οι ίδιοι οι χαρακτήρες \,, (, ), *,... Οι κανονικές εκφράσεις παρατέθηκαν σύμφωνα με την προτεραιότητά τους (από την υψηλότερη προς την χαμηλότερη). Παράδειγμα: Η foo bar* είναι ισοδύναμη με την (foo) (ba(r*)), επειδή ο τελεστής '*' έχει μεγαλύτερη προτεραιότητα από την παράθεση και αυτή από το τελεστή ' (alternation).

Προκαθορισμένες κλάσεις χαρακτήρων Το flex υποστηρίζει κάποιες προκαθορισμένες κλάσεις χαρακτήρων που μπορούν να χρησιμοποιηθούν σε κανονικές εκφράσεις. Ο συμβολισμός των κλάσεων αυτών έχει τη μορφή [:Χ:], όπου 'Χ' το όνομα της κλάσης. Συγκεκριμένα οι χαρακτήρες της κάθε κλάσης, ικανοποιούν τις συναρτήσεις 'isx(int c)' της επικεφαλίδας ctype.h. Οι κυριότερες από αυτές είναι: [:alnum:] - όλα τα αλφαριθμητικά: [a-za-z0-9] στο c (default) locale [:alpha:] - όλα τα γράμματα του αλφαβήτου: [a-za-z] στο c locale [:digit:] - όλα τα ψηφία του δεκαδικού συστήματος: [0-9] [:lower:] - όλα τα πεζά γράμματα του αλφαβήτου: [a-z] [:upper:] - όλα τα κεφαλαία γράμματα του αλφαβήτου: [A-Z] [:print:] - όλοι οι εκτυπώσιμοι χαρακτήρες [:space:] - όλοι οι χαρακτήρες whitespace [:xdigit:] - όλα τα ψηφία του δεκαεξαδικού συστήματος: [0-9a-eA-E]