ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο

of 42/42
slide 1/42 ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο Εισαγωγή στο Flex
  • date post

    22-Jan-2016
  • Category

    Documents

  • view

    57
  • download

    0

Embed Size (px)

description

Εισαγωγή στο Flex. ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο. Τι είναι το Flex. Μία γεννήτρια λεξικογραφικών αναλυτών Παράγει λεξικογραφικούς αναλυτές στις γλώσσες C/C++ (target language). Γενικά Χαρακτηριστικά του Flex. Υλοποίηση από την αρχή του “κλασσικού” Lex του AT&T Unix - PowerPoint PPT Presentation

Transcript of ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο

ΗΥ – 340 Γλσσες και Μεταφραστς ΦροντιστριοΕισαγωγ στο Flex
slide */42
Γενικ Χαρακτηριστικ του Flex
Υλοποηση απ την αρχ του “κλασσικο” Lex του AT&T Unix
Υπρχει για λα τα διαδεδομνα λειτουργικ συστματα (πχ. GNU/Linux, Solaris, Mac OS-X, Win32)
Παργει πολ γργορους λεξικογραφικος αναλυτς
Flex σημανει “Fast”- Lex ...
Για την περιγραφ ενς λεξικογραφικο αναλυτ στο flex/lex, χρησιμοποιονται
Κανονικς εκφρσεις (regular expressions regex) που περιγρφουν τα λεξικογραφικ πρτυπα μιας γλσσας
Actions, δηλαδ κδικας σε μα γλσσα προγραμματισμο που εκτελεται ταν αναγνωριστε μια κανονικ κφραση (στην οποα αντιστοιχε το action)
slide */42
“abcd...” - αναγνωρζει την ακολουθα χαρακτρων abcd...
. - (τελεα) αναγνωρζει οποιονδποτε χαρακτρα σμβολο πλην του newline
[xyz] – αναγνωρζει οποιονδποτε (ναν μνο) απ τους χαρακτρες που βρσκονται μσα στο σνολο. Δηλαδ το x το y το z
slide */42
Κανονικς Εκφρσεις (2/8)
[ab-e] – αναγνωρζει τους χαρακτρες a b c d e. Δηλαδ ο συμβολισμς b-e δημιουργε μα ακολουθα χαρακτρων που ξεκινον απ το b και καταλγουν στο e σμφωνα με το ascii char set.
[^ab-e] – ταν το σμβολο ^ εμφανζεται στην αρχ του συνλου σημανει την ΑΡΝΗΣΗ του συνλου. Δηλαδ το παραπνω αναγνωρζει ΟΛΟΥΣ τους χαρακτρες, εκτς απ τους a, b, c, d, e.
slide */42
r* - kleen star, αναγνωρζει καμα περισστερες επαναλψεις της κανονικς κφρασης 'r'
παρδειγμα
η a* περιγρφει τα ε, a, aa, aaaa, aaaaaaaaaaaa, ...
η [ab-e]* περιγρφει τα ε, a, c, ac, cab, bbbe, cbaead…
r+ - αναγνωρζει μα περισστερες επαναλψεις της κανονικς κφρασης r
παρδειγμα
η a+ περιγρφει τα a, aa, aaaa, αλλ χι το ε
η [ab-e]* περιγρφει τα a, c, ac, cab, bbbe, cbaead…
slide */42
Κανονικς Εκφρσεις (4/8)
r? - αναγνωρζει μα καμα επανληψη της κανονικς κφρασης r (διαβζεται ως προαιρετικ r)
r{i, j} – 0 < i < j, αναγνωρζει i, i+1, i+2, ..., j-1, j επαναλψεις της κανονικς κφρασης r
παρδειγμα
η .{2, 3} περιγρφει τις “λξεις” που αποτελονται απ 2 3 χαρακτρες, πχ. ant, ///, ..., 3/2, 23, 2b, or, not, ...
r{i,} - 0 < i, αναγνωρζει i περισστερες επαναλψεις της κανονικς κφρασης r
slide */42
Κανονικς Εκφρσεις (5/8)
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, ...
slide */42
Κανονικς Εκφρσεις (6/8)
(r) – οι παρενθσεις γρω απ μα κανονικ κφραση r, απλς αλλζουν την προτεραιτητα εφαρμογς των τελεστν
παρδειγμα
Η abc+ αναγνωρζει τις abc, abcc, abcccccc, ...
Εν η (abc)+ αναγνωρζει τις abc, abcabc, ...
Επσης η “abc”+ αναγνωρζει τις διες ακολουθες χαρακτρων που αναγνωρζει και η (abc)+
r|s – ικανοποιεται απ τις ακολουθες συμβλων που ικανοποιον την r τις ακολουθες που ικανοποιον την s χι και τις δο (xor).
slide */42
Η (”abc” | “ABC”){2,3} αναγνωρζει τις abcabc, abcABC, ABCABC, abcabcabc, ...
^r – ικανοποιεται ταν ικανοποιεται η r και η ακολουθα που την ικανοποιε βρσκεται στην αρχ της γραμμς
r$ – ικανοποιεται ταν ικανοποιεται η r και η ακολουθα που την ικανοποιε βρσκεται στο τλος της γραμμς
slide */42
\\, \”, \(, \), \*, \+, \[, \], \$, \^, \{, \}, ... οι διοι οι χαρακτρες \, ”, (, *, ... (escaped)
Οι κανονικς εκφρσεις παρατθηκαν σμφωνα με την προτεραιτητ τους (απ την υψηλτερη προς την χαμηλτερη).
Παραδειγμα:
Η foo|bar* εναι ισοδναμη με την (foo)|(ba(r*)), επειδ ο τελεστς '*' χει μεγαλτερη προτεραιτητα απ την παρθεση και αυτ απ το τελεστ '|' (alternation).
slide */42
Προκαθορισμνες κλσεις χαρακτρων
Το flex υποστηρζει κποιες προκαθορισμνες κλσεις χαρακτρων που μπορον να χρησιμοποιηθον σε κανονικς εκφρσεις. Ο συμβολισμς των κλσεων αυτν χει τη μορφ [:Χ:], που 'Χ' το νομα της κλσης.
Συγκεκριμνα οι χαρακτρες της κθε κλσης, ικανοποιον τις συναρτσεις 'isX(int c)' της επικεφαλδας “ctype.h”. Οι κυριτερες απ αυτς εναι:
slide */42
[:alpha:] - λα τα γρμματα του αλφαβτου: [a-zA-Z] στο c locale
[:digit:] - λα τα ψηφα του δεκαδικο συστματος: [0-9]
[:lower:] - λα τα πεζ γρμματα του αλφαβτου: [a-z]
[:upper:] - λα τα κεφαλαα γρμματα του αλφαβτου: [A-Z]
[:print:] - λοι οι εκτυπσιμοι χαρακτρες
[:space:] - λοι οι χαρακτρες whitespace
[:xdigit:] - λα τα ψηφα του δεκαεξαδικο συστματος: [0-9a-eA-E]
slide */42
Σε αυτ το τμμα, ο χρστης μπορε να ορσει:
Κδικα που θα αντιγραφε χωρς αλλαγς στο τελικ αρχεο .c που θα περιχει τον κδικα του παραγμενου λεξικογραφικο αναλυτ
Macros (aliases), που υποκαθιστον μα κανονικ κφραση.
Διφορες παραμτρους που επηρεζουν τα χαρακτηριστικ του παραγμενου λεξικογραφικο αναλυτ
Δλωση user-defined conditions
Τμμα ορισμν (2/10)
Ο κδικας που θλουμε να εισγουμε, θα πρπει να περικλεεται στα σμβολα “%{“ ... “%}” στα “%top{“ ... “}”
Μπορομε να κνουμε 'include' headers για να χρησιμοποισουμε συναρτσεις που εναι υλοποιημνες σε μα βιβλιοθκη
Μπορομε να υλοποισουμε συναρτσεις που θα χρησιμοποιονται απ τον παραγμενο συντακτικ αναλυτ
slide */42
Στην αναγνωσιμτητα του προγρμματος
Το συμβολικ νομα “literal” εναι πιο ευανγνωστο απ την αντστοιχη κανονικ κφραση που πιθανς το περιγρφει: “\"[^\n"]*\"”
slide */42
Τμμα ορισμν (6/10)
Οι παρμετροι που επηρεζουν τα χαρακτηριστικ του παραγμενου λεξικογραφικο αναλυτ ξεκινον με το σμβολο “%option”. Σχεδν λοι οι παρμετροι υπρχουν και σαν command line options
%option header-file=”./scanner.h”
Αναγκζει το flex να δημιουργσει μα επικεφαλδα που περιχει τις δηλσεις για τους τπους και τις συναρτσεις που χρησιμοποιονται απ τον παραγμενο λεξικογραφικ αναλυτ
slide */42
%option noyywrap
Δεν καλε τη συνρτηση “yywrap”, η οποα καλεται απ τον παραγμενο λεξικογραφικ αναλυτ ταν τελεισει το διβασμα ενς αρχεου (εν επιστρψει 0 συνεχζει το scanning απ την εσοδο)
%option yylineno
Δηλνει μα καθολικ μεταβλητ με το νομα “yylineno”, που κρατει τον αριθμ της τρχουσας γραμμς του αρχεου εισδου
%option case-insensitive
Ο παραγμενος λεξικογραφικς αναλυτς εναι case insensitive. Δηλαδ η λξη “ClaSS” θα εναι “ση” με την λξη “class”
slide */42
%option prefix="PREFIX"
Εξ' ορισμο οι τποι και οι συναρτσεις που χρησιμοποιε ο παραγμενος λεξικογραφικς αναλυτς χουν το πρθεμα “yy” πχ. yylex, yyin, yylineno, yytext, yywrap, ... Επομνος αυτ η παρμετρος, αλλζει το πρθεμα στο string “PREFIX”
%option nounistd
Δεν κνει 'include' την επικεφαλδα “unistd.h”, η οποα υπρχει μνο στα UNIX συστματα
slide */42
Τμμα ορισμν (9/10)
Ο χρστης μπορε να ορσει δικς του “καταστσεις” (conditions) και να ενεργοποιε ορισμνους καννες μνο εν ο λεξικογραφικς αναλυτς βρσκεται σε συγκεκριμνη user-defined κατσταση
Inclusive (start) conditions
Ορζονται με την εντολ “%s condition_name”
Μπορον να ενεργοποισουν λους τους καννες χωρς “<>” πρθεμα και αυτος με πρθεμα “<condition_name>”
Exclusive conditions
Μπορον να ενεργοποισουν μνο τους καννες με πρθεμα “<condition_name>”
slide */42
Αυτ εναι το κριο τμμα του προγρμματος περιγραφς του λεξικογραφικο αναλυτ, αφο σε αυτ καθορζεται η λειτουργικτητ του τελευταου
Σνταξη: <condition1, condition2, ...> Regular expression { action }
Τα conditions ανμεσα στα “<”, “>” αναφρονται στις καταστσεις που χει ορσει ο χρστης (με “%s” “%x”)
slide */42
Τμμα καννων (2/8)
Η παρθεση των conditions εναι προαιρετικ. Εν παραληφθον, ο καννας μπορε να ενεργοποιηθε ετε απ την προκαθορισμνη κατσταση (INITIAL), ετε απ τα inclusive conditions
Η προκαθορισμνη κατσταση στην οποα βρσκεται στην αρχ ο λεξικογραφικς αναλυτς (και η οποα εναι “inclusive”), εναι η INITIAL και μπορε να συμμετχει κανονικ στην λστα των conditions που προηγεται της κανονικς κφρασης
Η κατσταση “<*>” εναι συντομογραφα για ΟΛΕΣ τις καταστσεις που χει δηλσει ο χρστης και την INITIAL
slide */42
Μετ απ την παρθεση των user-defined καταστσεων (conditions), ακολουθε η κανονικ κφραση η οποα ταν ικανοποιηθε ενεργοποιε τον καννα
Η κανονικ κφραση μπορε να περιλαμβνει να αποτελεται αποκλειστικ απ τα macros που χουν δηλωθε στο τμμα ορισμν, τα οποα θα πρπει να περικλεονται στα σμβολα “{“, “}”, πχ. {comment}
Το ειδικ σμβολο “<<EOF>>” ικανοποιεται ταν τελεισει η ανγνωση του τρχοντος αρχεου
slide */42
Τμμα καννων (4/8)
Τλος, ταν ικανοποιηθε η δλωση των καταστσεων ΚΑΙ η κανονικ κφραση που ακολουθε, ο καννας ενεργοποιεται.
Αυτ σημανει τι εκτελεται ο κδικας που υπρχει δεξι της κανονικς κφρασης
Εν ο κδικας καταλαμβνει πνω απ μα γραμμ, θα πρπει να περικλεεται σε “{“, “}”
Οι κυριτερες συναρτσεις και μεταβλητς του παραγμενου λεξικογραφικο αναλυτ που εναι διαθσιμα και μπορον να χρησιμοποιηθον απ τους καννες εναι:
slide */42
Τμμα καννων (5/8)
yytext νας pointer σε char ( char array στον κλασσικ lex) που περιχει το κομμτι του κειμνου που χει ικανοποισει την κανονικ κφραση
yyleng νας ακραιος που δηλνει το μγεθος του yytext
BEGIN(condition_name) αναγκζει τον λεξικογραφικ αναλυτ να μεταβε στην κατσταση που χει ορσει ο χρστης με το νομα “condition_name”
ECHO αντιγρφει τα περιεχμενα του yytext στην ξοδο
REJECT εξαναγκζει τον λεξικογραφικ αναλυτ να ενεργοποισει τον “δετερο καλτερο” καννα
Προσοχ: Η χρση του REJECT σε οποιονδποτε καννα κνει πολ πιο αργ ολκληρο τον λεξικογραφικ αναλυτ
input() διαβζει και επιστρφει τον επμενο χαρακτρα απ την ακολουθα εισδου (look-ahead)
unput(c) τοποθετε τον χαρακτρα c στην ακολουθα εισδου. τσι ο επμενος χαρακτρας που θα διαβσει ο λεξικογραφικς αναλυτς, θα εναι ο c
slide */42
ταν παραπνω απ νας καννας ικανοποιεται ττε επιλγεται αυτς που καταναλνει τους περισστερους χαρακτρες.
Εν βρεθον δο παραπνω καννες που καταναλνουν τον διο αριθμ χαρακτρων, ττε επιλγεται αυτς που χει δηλωθε πρτος στο lex αρχεο.
slide */42
ταν αυτ παραλειφθε, μπορε να παραλειφθε και το δετερο σμβολο “%%”
Σκοπς της εναι μνο η εκολη και μεση προσθκη υλοποισεων των συναρτσεων που χρησιμοποιονται στον παραγμενο λεξικογραφικ αναλυτ
, τι προστθεται σε αυτ το τμμα, αντιγρφεται χωρς αλλαγς στο παραγμενο αρχεο .c που περιχει τον κδικα του λεξικογραφικο αναλυτ
slide */42
scanner.l
Εσοδος απ c strings και char buffers
Ο παραγμενος λεξικογραφικς αναλυτς, διαβζει την ακολουθα χαρακτρων εξ' ορισμο απ τον global FILE* pointer με το νομα “yyin” (και μπορομε να τον “κατευθνουμε” με τον τρπο που φανεται στην main() του αρχεου scanner.l του προηγομενου σχματος)
slide */42
Εσοδος απ c strings και char buffers
Πολλς φορς μως δε θλουμε να διαβζουμε την ακολουθα χαρακτρων προς επεξεργασα απ αρχεα (FILE* pointers)
Θλουμε να διαβζουμε χαρακτρες απ το δκτυο
Θλουμε να διαβζουμε χαρακτρες που υπρχουν σε memory buffers
τσι, για να διαβσει ο παραγμενος λεξικογραφικς αναλυτς μα ακολουθα απ χαρακτρες που βρσκονται στη μνμη (NULL terminated char* pointers, buffers)
slide */42
Πριν καλσουμε τη συνρτηση yylex(), θα πρπει να καλσουμε
Την συνρτηση yy_scan_string(const char* str) για να διαβσουμε απ το string str
Την συνρτηση yy_scan_bytes(char* buffer, size_t size) για να διαβσουμε απ να buffer μεγθους size
Οι συναρτσεις αυτς επιστρφουν να handle τπου YY_BUFFER_STATE το οποο θα πρπει να “ελευθερσουμε” ταν θα χει ολοκληρωθε το scanning, μσω της συνρτησης yy_delete_buffer(YY_BUFFER_STATE buffer)
slide */42