Lex (computerprogramma)

Lex
Ontwerp en ontwikkeling
Categorie Scannergenerator
Ontwikkelaar(s) Mike Lesk en Eric Schmidt
Besturings­systeem Unix
Links
Website (en) Lex - A Lexical Analyzer Generator
Versiebeheer Broncode
Portaal  Portaalicoon   Informatica

Lex is een computerprogramma voor het genereren van programma's voor lexicale analyse, ook wel scanners of lexers genoemd. Lex wordt onder meer gebruikt in combinatie met de parsergenerator Yacc: de scanner herkent onderdelen van de invoer, waarna de door Yacc gegenereerde parser de syntactische structuur daarvan bepaalt.

Lex werd ontwikkeld door Mike Lesk en Eric Schmidt voor het Unix-besturingssysteem. De werking van het commando lex en de bijbehorende specificatietaal zijn opgenomen in de POSIX-standaard.

Werking

De invoer van Lex is een specificatie van de te genereren scanner. Op basis daarvan genereert Lex een programma in C, dat vervolgens moet worden gecompileerd. De gegenereerde scanner bevat de functie yylex(), die de invoer leest en de opgegeven patronen herkent.

Een Lex-specificatie bestaat uit drie secties, gescheiden door regels met %%:

De definities en de aanvullende C-code kunnen worden weggelaten. Als er geen aanvullende C-code volgt, is ook het tweede scheidingsteken %% niet nodig. Wanneer meerdere regels op dezelfde positie in de invoer passen, kiest de scanner de regel die de langste tekst herkent. Bij een gelijke lengte krijgt de eerst vermelde regel voorrang.

Voorbeeld

De onderstaande Lex-specificatie is een aangepaste versie van een voorbeeld uit de handleiding van Flex. De scanner telt tekens en regeleinden in de invoer. De regel met \n verhoogt beide tellers; de regel met . herkent ieder ander teken en verhoogt alleen de tekenteller.

%{
#include <stdio.h>

int num_lines = 0;
int num_chars = 0;
%}

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

int yywrap(void)
{
    return 1;
}

int main(void)
{
    yylex();
    printf("Aantal regeleinden = %d, aantal tekens = %d\n",
           num_lines, num_chars);
    return 0;
}

De teller num_lines telt uitsluitend regeleinden: een laatste tekstregel zonder afsluitend regeleinde verhoogt deze teller niet.

Andere versies

Flex (fast lexical analyzer) is een alternatief voor Lex, oorspronkelijk geschreven door Vern Paxson. Het programma genereert scanners op basis van reguliere expressies en bijbehorende acties. Flex biedt ook ondersteuning voor het genereren van scanners in C++.

GPLEX (Gardens Point LEX) genereert scanners in C#. De invoertaal lijkt op die van Lex en bevat ook uitbreidingen uit Flex.