Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

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

Παρόμοιες παρουσιάσεις


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

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

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

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

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

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

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

7 Παράδειγμα

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

25 Παράδειγμα 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

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

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

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

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

30 Αναγνωριστές ▪Μια αφηρημένη μηχανή που δέχεται ως είσοδο μια συμβολοσειρά ενός αλφαβήτου και δίνει έξοδο “ναι” ή “όχι”. Αναφέρονται και ως αυτόματα. ▪Μηχανή Turing πολυπλοκότερο υπολογιστικό μοντέλο ▪Γραμμικά Περιορισμένη Μηχανή Turing ΜΤ με περιορισμό Μνήμης ▪Αυτόματα Στοίβας ▪Πεπερασμένα Αυτόματα.

31 Αντιστοιχία Μοντέλων

32 Κανονικές Εκφράσεις

33 ▪Χρησιμοποιούνται για την περιγραφή κανονικών γλωσσών. Κομψότερος και λακωνικότερος φορμαλισμός. ▪Αντιστοιχία μεταξύ κανονικών εκφράσεων και κανονικής γραμματικής και πεπερασμένων αυτομάτων. ▪Χρήση από εργαλεία κατασκευής λεκτικών αναλυτών.

34 Κανονικές Εκφράσεις ▪Έστω ένα αλφάβητο Σ, μια κανονική έκφραση (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 είναι κανονικές εκφράσεις.

35 Παραδείγματα ▪(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}. Ποιες είναι οι γλώσσες που παράγουν οι ακόλουθες κανονικές εκφράσεις:

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

37 Απαλοιφή Παρενθέσεων ▪Προτεραιότητα τελεστών Κλείσιμο 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]+)?

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

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

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

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

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

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

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

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

46 Κανονικές Εκφράσεις 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

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

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

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

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

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

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

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

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

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

56 Διαδικασία Δημιουργίας ΛΑ 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)

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

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

59 Παράδειγμα 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})* %

60 Παράδειγμα 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);} %

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

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


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

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google