Movatterモバイル変換


[0]ホーム

URL:


Μετάβαση στο περιεχόμενο
ΒικιπαίδειαΗ Ελεύθερη Εγκυκλοπαίδεια
Αναζήτηση

Lex

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

Στηνεπιστήμη υπολογιστών τοlex είναι έναπρόγραμμα που παράγειλεκτικούς αναλυτές ("scanners" ή "lexers").[1][2] Το lex συχνά χρησιμοποιείται μαζί με τηγεννήτρια συντακτικών αναλυτώνyacc. Αρχικά το lex γράφτηκε από τον Mike Lesk και τον Eric Schmidt, και αποτελεί την κλασική γεννήτρια παραγωγής λεκτικών αναλυτών σε πολλά συστήματαUnix, και ένα εργαλείο που έχει τη συμπεριφορά του περιλαμβάνεται στο πρότυποPOSIX.

Το lex διαβάζει ένα ρεύμα εισόδου (input stream) που ορίζει το λεκτικό αναλυτή και παράγειπηγαίο κώδικα που υλοποιεί το λεκτικό αναλυτή στηγλώσσα προγραμματισμού C.

Αν και παραδοσιακά αποτέλεσε κλειστόλογισμικό, είναι διαθέσιμες εκδόσειςανοιχτού κώδικα του lex που βασίζονται στον αρχικό κώδικα της AT&T, σαν μέρος συστημάτων όπως τοOpenSolaris και τοPlan 9 from Bell Labs. Μια άλλη δημοφιλής έκδοση ανοιχτού κώδικα του lex είναι τοflex, ο "γρήγορος λεκτικός αναλυτής" ("fast lexical analyzer").

Δομή ενός αρχείου lex

[Επεξεργασία |επεξεργασία κώδικα]

Η δομή ενός αρχείου lex έχει σχεδιαστεί ώστε να μοιάζει με αυτήν ενός αρχείου yacc - τα αρχεία χωρίζονται σε τρεις ενότητες που διακρίνονται μεταξύ τους από γραμμές που περιέχουν μόνο δύο σύμβολα "τοις εκατό", όπως το εξής:

Ενότητα των ορισμών (Definition section)%%Ενότητα των κανόνων (Rules section)%%Ενότητα κώδικα C (C code section)
  • Στηνενότητα των ορισμών ορίζονται οιμακροεντολές και εισάγονται τααρχεία επικεφαλίδας που είναι γραμμένα σε C. Μπορεί επίσης να γραφεί οποιοσδήποτε κώδικας C σε αυτό το σημείο, ο οποίος θα αντιγραφεί ως έχει στο παραγόμενο αρχείο πηγαίου κώδικα.
  • Ηενότητα των κανόνων είναι η σημαντικότερη: αντιστοιχίζει πρότυπα (patterns) με εντολές της C . Τα πρότυπα είναι απλάκανονικές εκφράσεις. Όταν ο λεκτικός αναλυτής εντοπίσει στην είσοδό του κάποιο κείμενο που ταιριάζει με κάποιο από τα δοθέντα πρότυπα, εκτελεί τον αντίστοιχο κώδικα C. Αυτός είναι ο βασικός τρόπος με τον οποίο λειτουργεί το lex.
  • Ηενότητα κώδικα C περιέχει εντολές C και συναρτήσεις που αντιγράφονται ως έχει στο παραγόμενο αρχείο πηγαίου κώδικα. Αυτές οι εντολές υποτίθεται ότι περιλαμβάνουν κώδικα που καλείται από τους κανόνες στην ενότητα των κανόνων. Σε μεγαλύτερα προγράμματα είναι πιο βολικό να τοποθετείται αυτός ο κώδικας σε ένα ξεχωριστό αρχείο και να γίνεται σύνδεση με αυτό στο χρόνομεταγλώττισης.

Παράδειγμα ενός αρχείου lex

[Επεξεργασία |επεξεργασία κώδικα]

Ακολουθεί ένα παράδειγμα ενός αρχείου lex για την έκδοσηflex του lex. Αναγνωρίζεισυμβολοσειρές από (ακέραιους) αριθμούς στην είσοδο και απλά τους τυπώνει.

/*** Ενότητα των ορισμών ***/%{/* Κώδικας C που θα αντιγραφεί ως έχει */#include <stdio.h>%}/* Αυτό λέει στο flex να διαβάσει μόνο ένα αρχείο εισόδου */%option noyywrap%%    /*** Ενότητα των κανόνων ***/    /* Το [0-9]+ ταιριάζει με μια συμβολοσειρά ενός η περισσότερων ψηφίων */[0-9]+  {            /* Το yytext είναι μια συμβολοσειρά που περιέχει το ταιριασμένο κείμενο. */            printf("Saw an integer: %s\n", yytext);        }.       {   /* Αγνοεί όλους τους άλλους χαρακτήρες. */   }%%/*** Ενότητα κώδικα C ***/int main(void){    /* Καλεί το λεκτικό αναλυτή και στη συνέχεια τερματίζει. */    yylex();    return 0;}

Αν αυτή η είσοδος δοθεί στο flex, θα μετατραπεί σε ένα αρχείο C, το lex.yy.c. Αυτό μπορεί να μεταγλωττιστεί σε ένα εκτελέσιμο το οποίο ταιριάζει και εμφανίζει συμβολοσειρές ακεραίων. Για παράδειγμα, για είσοδο:

abc123z.!&*2ghj6

το πρόγραμμα θα τυπώσει:

Saw an integer: 123Saw an integer: 2Saw an integer: 6

Χρήση του lex με άλλα εργαλεία προγραμματισμού

[Επεξεργασία |επεξεργασία κώδικα]

Χρήση του lex με γεννήτριες συντακτικών αναλυτών

[Επεξεργασία |επεξεργασία κώδικα]

Το lex και οι γεννήτριες συντακτικών αναλυτών, όπως τοYacc ή τοBison, συχνά χρησιμοποιούνται μαζί. Οι γεννήτριες συντακτικών αναλυτών χρησιμοποιούν μιατυπική γραμματική για να αναλύσουν συντακτικά ένα ρεύμα εισόδου, κάτι που το lex δε μπορεί να κάνει χρησιμοποιώντας απλές κανονικές εκφράσεις (το lex περιορίζεται σε απλάαυτόματα πεπερασμένων καταστάσεων). Όμως οι γεννήτριες συντακτικών αναλυτών δε μπορούν να διαβάσουν από ένα απλό ρεύμα εισόδου – χρειάζονται μια σειρά από λεκτικές μονάδες (tokens). Το lex συχνά χρησιμοποιείται για να παρέχει αυτές τις λεκτικές μονάδες στη γεννήτρια συντακτικών αναλυτών.

Lex και make

[Επεξεργασία |επεξεργασία κώδικα]

Τοmake είναι ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να συντηρεί προγράμματα που χρησιμοποιούν το lex. Το make θεωρεί ότι ένα αρχείο με την κατάληξη.l είναι αρχείο πηγαίου κώδικα lex. Η εσωτερική μακροεντολή του makeLFLAGS μπορεί να χρησιμοποιηθεί για να ορίσει επιλογές του lex που θα κληθούν αυτόματα από το make.[3]

Δείτε επίσης

[Επεξεργασία |επεξεργασία κώδικα]

Παραπομπές

[Επεξεργασία |επεξεργασία κώδικα]
  1. Levine, John R· Mason, Tony· Brown, Doug (1992).LEX & YACC (2 έκδοση).O'Reilly. σελίδες 1–2.ISBN 1-56592-000-7. 
  2. John Levine (Αύγουστος 2009).flex & bison. O'Reilly Media. σελ. 304.ISBN 978-0-596-15597-1. 
  3. «make», The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition (The IEEE and The Open Group), 2004, http://www.opengroup.org/onlinepubs/009695399/utilities/make.html 

Εξωτερικοί σύνδεσμοι

[Επεξεργασία |επεξεργασία κώδικα]
Ανακτήθηκε από "https://el.wikipedia.org/w/index.php?title=Lex&oldid=10677155"
Κατηγορίες:
Κρυμμένη κατηγορία:

[8]ページ先頭

©2009-2025 Movatter.jp