Lex is een computerprogramma voor het genereren van lexical analysers (of: scanners, lexers). Lex wordt meestal gebruikt in combinatie met de parsergenerator Yacc.

De eerste versie van lex werd ontwikkeld door Eric Schmidt en Mike Lesk. Lex werd de standaard scanner-generator van het Unix-besturingssysteem, en is gestandaardiseerd als onderdeel van de POSIX-standaard.

Werking De invoer van lex is een specificatie van de te genereren scanner. Op basis van deze specificatie genereert lex een scanner geschreven in C.

Een lex-specificatie voor een scanner bestaat uit 3 onderdelen: Een definitie Hier worden eventueel macro's gedefinieerd die later nodig zijn en headers geïmporteerd. Alle code in de definitie wordt onveranderd gekopieerd naar het gegenereerde C-programma. De regels Hier wordt het feitelijke gedrag van de scanner gedefinieerd. Dit gebeurt door reguliere expressies te koppelen aan C-code. Wanneer de scanner op text stuit die overeenkomt met een reguliere expressie wordt de bijbehorende C-code uitgevoerd. C-code Hier wordt alle overige C-code geplaatst die door de scanner gebruikt wordt. Als er in de regels bepaalde functies aangeroepen worden, kunnen deze functies hier gedefinieerd worden.

Voorbeeld De onderstaande lex-specificatie genereert een scanner die het aantal karakters en het aantal regels van zijn invoer telt.Dit voorbeeld komt uit de handleiding van flex

int num_lines = 0, num_chars = 0;

%% \n ++num_lines; ++num_chars; . ++num_chars;

%% main() { yylex(); printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars );

Andere versies Flex (fast lexical analyzer) is een veelgebruikt alternatief voor lex. Flex werd oorspronkelijk geschreven door Vern Paxson rond 1987 en is backward compatible met lex. Flex++ genereert scanners in C++.

GPLEX is een ander veelgebruikt alternatief voor lex. GPLEX genereert scanners in C# in plaats van C of C++.

Zie ook Lexicale analyse Yacc

Externe links Lex - A Lexical Analyzer Generator, M.E. Lesk, Eric Schmidt Flex homepage

Categorie:Parser Categorie:C (programmeertaal)