Lex (computerprogramma)

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.[1]

 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