Στηνεπιστήμη υπολογιστών το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 έχει σχεδιαστεί ώστε να μοιάζει με αυτήν ενός αρχείου yacc - τα αρχεία χωρίζονται σε τρεις ενότητες που διακρίνονται μεταξύ τους από γραμμές που περιέχουν μόνο δύο σύμβολα "τοις εκατό", όπως το εξής:
Ενότητα των ορισμών (Definition section)%%Ενότητα των κανόνων (Rules section)%%Ενότητα κώδικα C (C code section)
Ακολουθεί ένα παράδειγμα ενός αρχείου 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 και οι γεννήτριες συντακτικών αναλυτών, όπως τοYacc ή τοBison, συχνά χρησιμοποιούνται μαζί. Οι γεννήτριες συντακτικών αναλυτών χρησιμοποιούν μιατυπική γραμματική για να αναλύσουν συντακτικά ένα ρεύμα εισόδου, κάτι που το lex δε μπορεί να κάνει χρησιμοποιώντας απλές κανονικές εκφράσεις (το lex περιορίζεται σε απλάαυτόματα πεπερασμένων καταστάσεων). Όμως οι γεννήτριες συντακτικών αναλυτών δε μπορούν να διαβάσουν από ένα απλό ρεύμα εισόδου – χρειάζονται μια σειρά από λεκτικές μονάδες (tokens). Το lex συχνά χρησιμοποιείται για να παρέχει αυτές τις λεκτικές μονάδες στη γεννήτρια συντακτικών αναλυτών.
Τοmake είναι ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να συντηρεί προγράμματα που χρησιμοποιούν το lex. Το make θεωρεί ότι ένα αρχείο με την κατάληξη.l
είναι αρχείο πηγαίου κώδικα lex. Η εσωτερική μακροεντολή του makeLFLAGS
μπορεί να χρησιμοποιηθεί για να ορίσει επιλογές του lex που θα κληθούν αυτόματα από το make.[3]