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

Σχετικά έγγραφα
Φροντιστήριο 1ο Εισαγωγή στο FLEX. Flex. Regular Expressions (1/4)

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

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

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

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

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

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

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

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

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

PERL. Δήμος Παύλου Δημήτρης Κουζαπάς

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Regular Expressions ΓΛΩΣΣΙΚΉ ΤΕΧΝΟΛΟΓΊΑ

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

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

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

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

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

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

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

Slide 6 / 43. Slide 5 / 43. Α. Σαββίδης. Α. Σαββίδης. Slide 8 / 43. Slide 7 / 43. Α. Σαββίδης. Α. Σαββίδης HY340, 2009 HY340, 2009 HY340, 2009

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΚΕΦΑΛΑΙΟ 3. Εκφράσεις, τελεστές, σχόλια. 3.1 Εισαγωγή

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

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

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

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

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Τυχαίοι αριθμοί struct Αρχεία Διαμορφώσεις Συναρτήσεις Χειρισμός σφαλμάτων ΠΕΜΠΤΗ ΔΙΑΛΕΞΗ

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

Ενδεικτική περιγραφή μαθήματος

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Μεθόδων Επίλυσης Προβλημάτων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

S, (5, -3, 34, -23, 7) ( *, _

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

Διαδικασιακός Προγραμματισμός

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

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

Βασικές έννοιες προγραμματισμού

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

Μεθοδολογία Προγραμματισμού

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

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

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι

Transcript:

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Φροντιστήριο 1ο Εισαγωγή στο FLEX ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης Slide 2 / 26 Flex Μια γεννήτρια λεξικογραφικών αναλυτών για τις γλώσσες C/C++ Για την περιγραφή του λεξικογραφικού αναλυτή χρησιμοποιούνται: Regular expressions, που περιγράφουν τα πρότυπα της γλώσσας Actions, δηλαδή ενέργειες που πρέπει να πραγματοποιηθούν όταν αναγνωριστεί κάποιο συγκεκριμένο regular expression Regular Expressions (1/4) x αναγνωρίζει το χαρακτήρα x abcd - αναγνωρίζει την ακολουθία abcd. (τελεία) - αναγνωρίζει οποιοδήποτε χαρακτήρα ή σύμβολο εκτός από το new line [xyz] αναγνωρίζει ένα από τους χαρακτήρες μέσα στο σύνολο, δηλαδή το x, το y ή το z [ab-eg] αναγνωρίζει τους χαρακτήρες a, b έως e και g [^ab-e] αναγνωρίζει οποιοδήποτε χαρακτήρα ή σύμβολο δεν ανήκει στο σύνολο [ab ab-e] (δηλαδή οτιδήποτε εκτός από a, b, c, d, e) Slide 3 / 26 Slide 4 / 26

Regular Expressions (2/4) r* - αναγνωρίζει καμία ή περισσότερες επαναλήψεις του r a* περιγράφει τα ε, a, aa, aaa, r+ - αναγνωρίζει ρζ μια ή περισσότερες ρ επαναλήψεις του r a+ περιγράφει τα a, aa, aaa,, αλλά όχι το ε r? - αναγνωρίζει καμία ή μια επανάληψη του r (διαβάζεται και προαιρετικό r) r{i, j} - αναγνωρίζει i έως j επαναλήψεις του r (όπου i, j > 0 και i < j) r{i} αναγνωρίζει ακριβώς i επαναλήψεις του r r{i,} αναγνωρίζει i ή περισσότερες επαναλήψεις του r Regular Expressions (3/4) rs αναγνωρίζει τις ακολουθίες που αναγνωρίζει η συνένωση των r και s (concatenation) (r) αναγνωρίζει την ακολουθία r (χρησιμοποιείται για να καθορίσει την προτεραιότητα) abc+ αναγνωρίζει τα abc, abcc, abccc, (abc)+ αναγνωρίζει τα abc, abcabc, r s αναγνωρίζει το r ή το s ^r αναγνωρίζει το r αλλά μόνο όταν βρίσκεται στην αρχή της γραμμής r$ αναγνωρίζει το r αλλά μόνο όταν βρίσκεται στο τέλος της γραμμής \\, \, \(, \), \*, \+, \[, \], \$, \^, \{, \},... αναγνωρίζει τους ίδιους τους χαρακτήρες \,, (, *, (escaped) Slide 5 / 26 Slide 6 / 26 Regular Expressions (4/4) Προσοχή στην προτεραιότητα!! Το foo bar* είναι ισοδύναμο με (foo) (ba(r*)) επειδή ο τελεστής * έχει μεγαλύτερη προτεραιότητα από την παρένθεση και αυτή από τον τελεστή Αν θέλαμε να αναγνωρίσουμε το foo ή μηδέν ή περισσότερα ρ bar θα γράφαμε foo (bar)* Αν θέλαμε να αναγνωρίσουμε μηδέν ή περισσότερα foo ή bar θα γράφαμε (foo bar)* Προκαθορισμένες Κλάσεις Χαρακτήρων Ο flex ορίζει κάποιες προκαθορισμένες κλάσεις χαρακτήρων για χρήση σε regular expressions Συμβολίζονται [:X:] όπου Χ το όνομα της κλάσης Το Χ μπορεί να είναι: alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit. Οι κλάσεις αυτές ορίζουν σύνολα χαρακτήρων που αντιστοιχούν στις standard C συναρτήσεις isx(int c) του <ctype.h> Slide 7 / 26 Slide 8 / 26

Τμήμα ορισμών %% Τμήμα κανόνων %% Δομή Προγράμματος Flex Τμήμα κώδικα χρήστη (προαιρετικό) Τμήμα Ορισμών - Γενικά 1. Κώδικας που αντιγράφεται ως έχει στο παραγόμενο αρχείο με τον κώδικα του λεξικογραφικού αναλυτή Πρέπει να βρίσκεται μέσα στα σύμβολα {% /*code*/ %} ή %top{ /*code*/ } 2. Macros (aliases) για regular expressions Συντάσσονται name regex και βοηθούν στην αναγνωσιμότητα του προγράμματος (Π.χ. χ literal αντί για \"[^\n"]* n"]*\" " ) 3. Παράμετροι για τον παραγόμενο λεξικογραφικό αναλυτή %option option_name name ή %option option=value 4. User-defined d conditions Δυνατότητα ενεργοποίησης κανόνων με βάση την κατάσταση στην οποία βρίσκεται ο λεξικογραφικός αναλυτής Slide 9 / 26 Slide 10 / 26 Τμήμα Ορισμών Παράμετροι (1/2) %option header-file=./scanner.h Δημιουργεί ένα header file που περιέχει τις δηλώσεις για τους τύπους και τις συναρτήσεις που χρησιμοποιούνται από τον παραγόμενο λεξικογραφικό αναλυτή %option noyywrap Δεν χρησιμοποιεί τη συνάρτηση yywrap, που καλείται από τον παραγόμενο λεξικογραφικό αναλυτή όταν τελειώσει το διάβασμα ενός αρχείου (αν αυτή επιστρέψει 0 ο αναλυτής συνεχίσει το scanning από την είσοδο) %option yylineno Δηλώνει μια καθολική μεταβλητή με όνομα yylineno, που κρατάει τον αριθμό της τρέχουσας γραμμής του αρχείου εισόδου %option case-insensitive Ο παραγόμενος λεξικογραφικός αναλυτής είναι case insensitive. Αυτό σημαίνει ότι η λέξη ClaSS θα είναι ίδια με τη λέξη class Τμήμα Ορισμών Παράμετροι (2/2) %option reentrant Ο παραγόμενος λεξικογραφικός αναλυτής είναι reentrant (μπορούμε να κάνουμε νέα κλήση στην yylex πριν τελειώσει η προηγουμενη). Προσοχή καθώς αλλάζει ο τρόπος κλήσης της yylex %option prefix="prefix" Εξ ορισμού οι τύποι και οι συναρτήσεις που χρησιμοποιεί ο παραγόμενος λεξικογραφικός αναλυτής έχουν το πρόθεμα yy πχ. yylex, yyin, yylineno, yytext, yywrap,... Αυτή η παράμετρος αλλάζει το πρόθεμα σε PREFIX %option nounistd Δεν κάνει 'include' το header file unistd.h, το οποίο υπάρχει μόνο στα UNIX συστήματα Slide 11 / 26 Slide 12 / 26

Τμήμα Ορισμών User defined conditions Inclusive (start) conditions Ορίζονται με την εντολή %s condition_name Μπορούν να ενεργοποιήσουν όλους τους κανόνες χωρίς <> πρόθεμα και αυτούς με πρόθεμα <condition _ name> Exclusive conditions Ορίζονται με την εντολή %x condition_name Μπορούν να ενεργοποιήσουν μόνο τους κανόνες με πρόθεμα <condition_name> Τμήμα Ορισμών Παράδειγμα Κώδικας Παράμετροι Ορισμοί regular expressions User defined conditions Slide 13 / 26 Slide 14 / 26 Τμήμα Κανόνων - Γενικά Το κύριο τμήμα του προγράμματος περιγραφής του λεξικογραφικού αναλυτή, αφού σε αυτό καθορίζεται η λειτουργικότητά του Σύνταξη: <condition1, condition2,...> Regular expression { action } Όταν παραπάνω από ένας κανόνας ικανοποιείται, τότε επιλέγεται αυτός που καταναλώνει τους περισσότερους χαρακτήρες Αν βρεθούν δύο ή παραπάνω κανόνες που καταναλώνουν τον ίδιο αριθμό χαρακτήρων τότε επιλέγεται αυτός που έχει δηλωθεί πρώτος Τμήμα Κανόνων - Conditions Conditions Τα conditions ανάμεσα στα <, > αναφέρονται σε conditions που έχει ορίσει ο χρήστης (με %s ή %x ) Η παράθεσή τους είναι προαιρετική. Αν παραληφθούν ο κανόνας μπορεί να ενεργοποιηθεί είτε από την default κατάσταση, είτε από τα inclusive conditions Η default κατάσταση στην οποία βρίσκεται στην αρχή ο λεξικογραφικός αναλυτής (και η οποία είναι inclusive), είναι η INITIAL και μπορεί να συμμετέχει κανονικά στη λίστα των conditions που προηγείται της κανονικής έκφρασης Η κατάσταση <*> είναι συντομογραφία για όλες τις καταστάσεις που έχει δηλώσει ο χρήστης και για την INITIAL Slide 15 / 26 Slide 16 / 26

Τμήμα Κανόνων Regular Expressions & Actions Regular Expression To regular expression μπορεί να περιλαμβάνει ή να αποτελείται αποκλειστικά από τα macros που έχουν δηλωθεί στο τμήμα ορισμών, τα οποία θα πρέπει να περικλείονται στα σύμβολα {, }, π.χ. {comment} Το ειδικό σύμβολο <<EOF>> ικανοποιείται όταν τελειώσει η ανάγνωση του τρέχοντος αρχείου Action Ενεργοποιείται όταν ικανοποιείτε κάποια από τις καταστάσεις και το regular expression που ακολουθεί Αν ο κώδικάς του είναι πάνω από ένα statement θα πρέπει να περικλείεται σε {, } (μέσα σε block) Ο κώδικας μπορεί να χρησιμοποιεί κάποιες συναρτήσεις και μεταβλητές του παραγόμενου λεξικογραφικού αναλυτή Τμήμα Κανόνων Διαθέσιμες μεταβλητές και συναρτήσεις yytext: ένας pointer σε char (ή char array στον κλασσικό lex) που περιέχει το κομμάτι του κειμένου που έχει ικανοποιήσει το regular expression yyleng: ένας ακέραιος που δηλώνει το μέγεθος του yytext BEGIN(condition_name): βάζει το λεξικογραφικό αναλυτή να μεταβεί στην κατάσταση με όνομα condition_name name ECHO: αντιγράφει τα περιεχόμενα του yytext στην έξοδο. REJECT: βάζει το λεξικογραφικό αναλυτή να ενεργοποιήσει το «δεύτερο καλύτερο» κανόνα Προσοχή: Η χρήση του REJECT σε οποιονδήποτε κανόνα κάνει πολύ πιο αργό ολόκληρο το λεξικογραφικό αναλυτή input(): διαβάζει και επιστρέφει τον επόμενο χαρακτήρα από την ακολουθία εισόδου (look-ahead) unput(c): τοποθετεί το χαρακτήρα c στην ακολουθία εισόδου. Έτσι ο επόμενος χαρακτήρας που θα διαβάσει ο λεξικογραφικός αναλυτής θα είναι ο c Slide 17 / 26 Slide 18 / 26 Τμήμα Κανόνων - Παραδείγματα Τμήμα Κώδικα Χρήστη Το τμήμα κώδικα χρήστη είναι προαιρετικό και όταν παραλειφθεί μπορεί να παραλειφθεί και το δεύτερο σύμβολο %% Σκοπός του είναι μόνο η εύκολη και άμεση προσθήκη υλοποιήσεων των συναρτήσεων που χρησιμοποιούνται από τον παραγόμενο λεξικογραφικό αναλυτή Ό,τι προστίθεται σε αυτό το τμήμα αντιγράφεται χωρίς αλλαγές στο παραγόμενο αρχείο.c που περιέχει τον κώδικα του λεξικογραφικού αναλυτή Παράδειγμα: Κανόνες χωρίς condition Κανόνες με condition Slide 19 / 26 Slide 20 / 26

Ένας ολοκληρωμένος λεξικογραφικός αναλυτής Διαδικασία για την παραγωγή του τελικού προγράμματος αρχείο scanner.l scanner.l Meta compiler για λεξικογραφικούς αναλυτές (flex/lex) scanner.c βιβλιοθήκες εκτελέσιμο: scanner C/C++ Compiler Slide 21 / 26 Slide 22 / 26 Είσοδος από c strings και char buffers (1/3) Ο παραγόμενος λεξικογραφικός αναλυτής, διαβάζει την ακολουθία χαρακτήρων εξ ορισμού από το global global FILE* pointer με όνομα yyin (και μπορούμε να τον «κατευθύνουμε» όπως φαίνεται στη main() που είδαμε πιο πριν) ) Πολλές φορές όμως δε θέλουμε να διαβάζουμε την ακολουθία χαρακτήρων προς επεξεργασία από αρχεία (FILE* pointers) Θέλουμε να διαβάσουμε χαρακτήρες από το δίκτυο Θέλουμε να διαβάσουμε χαρακτήρες που υπάρχουν σε memory buffers Ο flex παρέχει συναρτήσεις με τις οποίες μπορούμε να τον βάλουμε να διαβάσει από μια ακολουθία από χαρακτήρες που βρίσκονται στη μνήμη (NULL terminated char* pointers, buffers) Είσοδος από c strings και char buffers (2/3) Αρχικά δημιουργούμε ένα handle τύπου YY_BUFFER_STATE που θα περιέχει την είσοδο του λεξικογραφικού αναλυτή Χρησιμοποιούμε τη yy_scan_string(const char* str) αν θέλουμε να διαβάσουμε από το string str Χρησιμοποιούμε τη yy_scan_bytes(char* buffer, size_t size) αν θέλουμε να διαβάσουμε από ένα buffer μεγέθους size Κατόπιν καλούμε κανονικά τη συνάρτηση yylex() για να πραγματοποιηθεί η λεξικογραφική ανάλυση Αφού έχει ολοκληρωθεί η λεξικογραφική ανάλυση, αποδεσμεύουμε τη μνήμη που αντιστοιχεί στο handle που έχουμε κρατήσει καλώντας την yy_delete_buffer(yy_buffer_state buffer) Slide 23 / 26 Slide 24 / 26

Είσοδος από c strings και char buffers (3/3) Συναρτήσεις για είσοδο από strings ti και buffers Flex Home Page References http://www.gnu.org/software/flex Flex Manual http://www.gnu.org/software/flex/manual/ Flex for Windows http://gnuwin32.sourceforge.net/packages/flex.htm Slide 25 / 26 Slide 26 / 26