Lexical Analysis (Analyzer) στο Compiler Design με Παράδειγμα
Τι είναι η Λεξιλογική Ανάλυση;
Λεξιλογική Ανάλυση είναι η πρώτη φάση στο σχεδιασμό του μεταγλωττιστή. Ένας Lexer παίρνει τον τροποποιημένο πηγαίο κώδικα που είναι γραμμένος με τη μορφή προτάσεων. Με άλλα λόγια, σας βοηθά να μετατρέψετε μια ακολουθία χαρακτήρων σε μια ακολουθία από διακριτικά. Ο λεξικός αναλυτής σπάει αυτή τη σύνταξη σε μια σειρά από διακριτικά. Αφαιρεί τυχόν επιπλέον χώρο ή σχόλιο γραμμένο στον πηγαίο κώδικα.
Τα προγράμματα που εκτελούν Λεξιλογική Ανάλυση στο σχεδιασμό μεταγλωττιστών ονομάζονται λεξικοί αναλυτές ή lexers. Ένα lexer περιέχει tokenizer ή scanner. Εάν ο λεξικός αναλυτής εντοπίσει ότι το διακριτικό δεν είναι έγκυρο, δημιουργεί ένα σφάλμα. Ο ρόλος του Lexical Analyzer στη σχεδίαση μεταγλωττιστή είναι να διαβάζει ροές χαρακτήρων από τον πηγαίο κώδικα, να ελέγχει για νόμιμα διακριτικά και να μεταβιβάζει τα δεδομένα στον αναλυτή σύνταξης όταν το απαιτεί.
Παράδειγμα
How Pleasant Is The Weather?
Δείτε αυτό το παράδειγμα Λεξιλογικής Ανάλυσης. Εδώ, μπορούμε εύκολα να αναγνωρίσουμε ότι υπάρχουν πέντε λέξεις How Pleasant, The, Weather, Is. Αυτό είναι πολύ φυσικό για εμάς καθώς μπορούμε να αναγνωρίσουμε τα διαχωριστικά, τα κενά και το σύμβολο στίξης.
HowPl easantIs Th ewe ather?
Τώρα, ελέγξτε αυτό το παράδειγμα, μπορούμε επίσης να το διαβάσουμε. Ωστόσο, θα χρειαστεί λίγος χρόνος επειδή τοποθετούνται διαχωριστικά στις Μονές θέσεις. Δεν είναι κάτι που σου έρχεται αμέσως.
Βασικές ορολογίες
Τι είναι το λεξικό;
Ένα λεξικό είναι μια ακολουθία χαρακτήρων που περιλαμβάνονται στο πρόγραμμα πηγής σύμφωνα με το μοτίβο που ταιριάζει σε ένα διακριτικό. Δεν είναι τίποτα άλλο παρά ένα παράδειγμα ενός συμβολικού.
Τι είναι ένα διακριτικό;
Τα διακριτικά στο σχεδιασμό του μεταγλωττιστή είναι η ακολουθία χαρακτήρων που αντιπροσωπεύει μια μονάδα πληροφοριών στο πρόγραμμα πηγής.
Τι είναι το Μοτίβο;
Ένα μοτίβο είναι μια περιγραφή που χρησιμοποιείται από το διακριτικό. Στην περίπτωση μιας λέξης-κλειδιού που χρησιμοποιείται ως διακριτικό, το μοτίβο είναι μια ακολουθία χαρακτήρων.
Λεξιλογικός Αναλυτής Architecture: Πώς αναγνωρίζονται τα tokens
Το κύριο καθήκον της λεξιλογικής ανάλυσης είναι να διαβάζει τους χαρακτήρες εισόδου στον κώδικα και να δημιουργεί διακριτικά.
Ο λεξιλογικός αναλυτής σαρώνει ολόκληρο τον πηγαίο κώδικα του προγράμματος. Προσδιορίζει κάθε διακριτικό ένα προς ένα. Οι σαρωτές συνήθως υλοποιούνται για την παραγωγή διακριτικών μόνο όταν ζητούνται από έναν αναλυτή. Εδώ είναι πώς λειτουργεί η αναγνώριση των tokens στο σχεδιασμό μεταγλωττιστή-

- Το "Get next token" είναι μια εντολή που αποστέλλεται από τον αναλυτή στον λεξικό αναλυτή.
- Με τη λήψη αυτής της εντολής, ο λεξικός αναλυτής σαρώνει την είσοδο μέχρι να βρει το επόμενο διακριτικό.
- Επιστρέφει το διακριτικό στον Parser.
Το Lexical Analyzer παραλείπει τα κενά και τα σχόλια κατά τη δημιουργία αυτών των διακριτικών. Εάν υπάρχει κάποιο σφάλμα, τότε ο Λεξικός αναλυτής θα συσχετίσει αυτό το σφάλμα με το αρχείο προέλευσης και τον αριθμό γραμμής.
Ρόλοι του λεξικού αναλυτή
Ο λεξικός αναλυτής εκτελεί τις παρακάτω συγκεκριμένες εργασίες:
- Βοηθά στον εντοπισμό του διακριτικού στον πίνακα συμβόλων
- Αφαιρεί τα λευκά κενά και τα σχόλια από το πρόγραμμα πηγής
- Συσχετίζει μηνύματα σφάλματος με το πρόγραμμα προέλευσης
- Σας βοηθά να επεκτείνετε τις μακροεντολές εάν βρίσκονται στο πρόγραμμα πηγής
- Διαβάστε τους χαρακτήρες εισαγωγής από το πρόγραμμα πηγής
Παράδειγμα Lexical Analysis, Tokens, Non-Tokens
Εξετάστε τον ακόλουθο κώδικα που τροφοδοτείται στο Lexical Analyzer
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Παραδείγματα Tokens που δημιουργήθηκαν
Lexeme | Ένδειξη |
---|---|
int | Λέξη-κλειδί |
ανώτατο όριο | Αναγνωριστικό |
( | OperaTor |
int | Λέξη-κλειδί |
x | Αναγνωριστικό |
, | OperaTor |
int | Λέξη-κλειδί |
Y | Αναγνωριστικό |
) | OperaTor |
{ | OperaTor |
If | Λέξη-κλειδί |
Παραδείγματα Nontokens
Χαρακτηριστικά | Παραδείγματα |
---|---|
Σχόλιο | // Αυτό θα συγκρίνει 2 αριθμούς |
Οδηγία προεπεξεργαστή | #περιλαμβάνω |
Οδηγία προεπεξεργαστή | #define NUMS 8,9 |
Macro | NUMS |
Λευκό χώρο | /n /b /t |
Λεξικά λάθη
Μια ακολουθία χαρακτήρων που δεν είναι δυνατή η σάρωση σε οποιοδήποτε έγκυρο διακριτικό είναι ένα λεξικό σφάλμα. Σημαντικά στοιχεία για το λεξικό λάθος:
- Τα λεξικά λάθη δεν είναι πολύ συνηθισμένα, αλλά θα πρέπει να αντιμετωπίζονται από έναν σαρωτή
- Η ορθογραφία των αναγνωριστικών, των τελεστών, των λέξεων-κλειδιών θεωρούνται ως λεξικά λάθη
- Γενικά, ένα λεξικό σφάλμα προκαλείται από την εμφάνιση κάποιου παράνομου χαρακτήρα, κυρίως στην αρχή ενός διακριτικού.
Ανάκτηση σφαλμάτων στο Lexical Analyzer
Ακολουθούν μερικές από τις πιο κοινές τεχνικές ανάκτησης σφαλμάτων:
- Αφαιρεί έναν χαρακτήρα από την υπόλοιπη είσοδο
- Στη λειτουργία πανικού, οι διαδοχικοί χαρακτήρες πάντα αγνοούνται μέχρι να φτάσουμε σε ένα καλοσχηματισμένο διακριτικό
- Εισάγοντας τον χαρακτήρα που λείπει στην υπόλοιπη είσοδο
- Αντικαταστήστε έναν χαρακτήρα με έναν άλλο χαρακτήρα
- Μεταφέρετε δύο σειριακούς χαρακτήρες
Lexical Analyzer vs. Parser
Λεξιλογικός Αναλυτής | Αναλυτής |
---|---|
Πρόγραμμα εισαγωγής σάρωσης | Εκτελέστε ανάλυση σύνταξης |
Προσδιορίστε τα Tokens | Δημιουργήστε μια αφηρημένη αναπαράσταση του κώδικα |
Εισαγάγετε διακριτικά στον Πίνακα συμβόλων | Ενημέρωση καταχωρήσεων πίνακα συμβόλων |
Δημιουργεί λεξιλογικά λάθη | Δημιουργεί ένα δέντρο ανάλυσης του πηγαίου κώδικα |
Γιατί να διαχωρίσετε Lexical και Parser;
- Η απλότητα του σχεδιασμού: Διευκολύνει τη διαδικασία της λεξιλογικής ανάλυσης και της συντακτικής ανάλυσης εξαλείφοντας τα ανεπιθύμητα διακριτικά
- Για να βελτιώσετε την αποτελεσματικότητα του μεταγλωττιστή: Σας βοηθά να βελτιώσετε την απόδοση του μεταγλωττιστή
- Εξειδίκευση: μπορούν να εφαρμοστούν εξειδικευμένες τεχνικές για τη βελτίωση της διαδικασίας λεξιλογικής ανάλυσης
- Φορητότητα: μόνο ο σαρωτής χρειάζεται για να επικοινωνήσει με τον έξω κόσμο
- Υψηλότερη φορητότητα: ιδιαιτερότητες για συγκεκριμένες συσκευές εισόδου που περιορίζονται στο lexer
Πλεονεκτήματα της Λεξιλογικής ανάλυσης
- Η μέθοδος λεξικού αναλυτή χρησιμοποιείται από προγράμματα όπως οι μεταγλωττιστές που μπορούν να χρησιμοποιήσουν τα αναλυμένα δεδομένα από τον κώδικα ενός προγραμματιστή για να δημιουργήσουν έναν μεταγλωττισμένο δυαδικό εκτελέσιμο κώδικα
- Χρησιμοποιείται από προγράμματα περιήγησης ιστού για τη μορφοποίηση και εμφάνιση μιας ιστοσελίδας με τη βοήθεια αναλυμένων δεδομένων από JavaScript, HTML, CSS
- Ένας ξεχωριστός λεξικός αναλυτής σάς βοηθά να δημιουργήσετε έναν εξειδικευμένο και δυνητικά πιο αποτελεσματικό επεξεργαστή για την εργασία
Μειονέκτημα της Λεξιλογικής ανάλυσης
- Πρέπει να αφιερώσετε σημαντικό χρόνο για να διαβάσετε το πρόγραμμα πηγής και να το χωρίσετε με τη μορφή διακριτικών
- Ορισμένες τυπικές εκφράσεις είναι αρκετά δύσκολο να κατανοηθούν σε σύγκριση με τους κανόνες PEG ή EBNF
- Απαιτείται περισσότερη προσπάθεια για την ανάπτυξη και τον εντοπισμό σφαλμάτων του lexer και των χαρακτηριστικών του περιγραφών
- Απαιτείται επιπλέον επιβάρυνση χρόνου εκτέλεσης για τη δημιουργία των πινάκων lexer και την κατασκευή των διακριτικών
Σύνοψη
- Η λεξική ανάλυση είναι η πρώτη φάση στο σχεδιασμό του μεταγλωττιστή
- Lexemes και Tokens είναι η ακολουθία χαρακτήρων που περιλαμβάνονται στο πρόγραμμα πηγής σύμφωνα με το μοτίβο που ταιριάζει σε ένα διακριτικό
- Ο λεξικός αναλυτής υλοποιείται για να σαρώσει ολόκληρο τον πηγαίο κώδικα του προγράμματος
- Ο λεξικός αναλυτής βοηθά στην αναγνώριση του διακριτικού στον πίνακα συμβόλων
- Μια ακολουθία χαρακτήρων που δεν είναι δυνατή η σάρωση σε οποιοδήποτε έγκυρο διακριτικό είναι ένα λεξικό σφάλμα
- Η αφαίρεση ενός χαρακτήρα από την υπόλοιπη είσοδο είναι χρήσιμη Μέθοδος ανάκτησης σφαλμάτων
- Το Lexical Analyzer σαρώνει το πρόγραμμα εισόδου ενώ ο αναλυτής εκτελεί συντακτική ανάλυση
- Διευκολύνει τη διαδικασία της λεξιλογικής ανάλυσης και της συντακτικής ανάλυσης εξαλείφοντας τα ανεπιθύμητα διακριτικά
- Ο λεξιλογικός αναλυτής χρησιμοποιείται από προγράμματα περιήγησης ιστού για τη μορφοποίηση και εμφάνιση μιας ιστοσελίδας με τη βοήθεια αναλυμένων δεδομένων από JavsScript, HTML, CSS
- Το μεγαλύτερο μειονέκτημα της χρήσης του Lexical αναλυτή είναι ότι χρειάζεται επιπλέον επιβάρυνση χρόνου εκτέλεσης που απαιτείται για τη δημιουργία των πινάκων lexer και την κατασκευή των διακριτικών