Lex (software)

Lex
Typ softwarustandardní UNIXová utilita
Některá data mohou pocházet z datové položky.

Lex je v informatice program sloužící pro generování lexikálních analyzátorů.[1][2] Často se využívá společně s generátorem syntaktických analyzátorů, programem yacc. Lex vytvořil Eric Schmidt a Mike Lesk. Je běžnou součástí mnoha unixových systémů a stal se součástí standardu POSIX. Přestože je Lex tradičně proprietární nástroj, existují verze založené na původním kódu od AT&T jako open source v rámci systémů OpenSolaris a Plan 9 from Bell Labs. Velmi populární open source variantou je program flex.

Na vstupu čte Lex specifikaci lexikálního analyzátoru a na výstupu k němu poskytuje zdrojový kód v programovacím jazyce C.

Struktura lex souboru

Struktura vstupu je záměrně velice podobná výstupu programu yacc. Soubor je rozdělen do tří částí (sekcí), které jsou vzájemně odděleny dvěma znaky procenta („%%“), jak ukazuje následující příklad.

Sekce definic
%%
Sekce pravidel
%%
Sekce kódu v jazyce C
  • Sekce definice: je určena pro definici maker a import hlavičkových souborů v jazyce C. Je zde možno zapsat i kód jazyka C, který bude beze změn vložen do vygenerovaného souboru.
  • Sekce pravidel: je nejdůležitější, protože jsou zde umístěny vzory, které jsou v podstatě regulárními výrazy. Tyto vzory jsou zapsany v jazyce C a vykonány ve chvíli, kdy je nalezena shoda na vstupu s daným regulárním výrazem. Toto je základ toho jak lex funguje.
  • Sekce kódu v jazyce C: obsahuje příkazy a funkce, které jsou beze změny zkopírovány do výsledného souboru. Příkazy jsou de fakto kódem, který je volán pomocí daných pravidel z oblasti pravidel. Při využití ve velkých aplikacích je lepší tuto sekci umístit do externího souboru a ten nalinkovat ve chvíli překladu.

Příklad souboru pro lex

Následující kód je ukázkou vstupního souboru pro Flex, která je jednou z verzí lexu. Dokáže rozpoznat řetězce čísel na vstupu a poté je zobrazit na výstupu.

/*** Oblast definice ***/

%{
/* Kód v jazyce C, který je bezezmněny zkopírován do výstupního souboru */
#include <stdio.h>
%}

/* Toto nastavení říká flexu, aby četl pouze jeden soubor na vstupu */
%option noyywrap

%%
    /*** Oblast pravidel ***/

    /* [0-9]+ pravidlo pro řetězec obsahující minimálně jedno číslo */
[0-9]+  {
            /* yytext je řetězec obsahující text vyhovující pravidlu. */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Ignoruj všechny ostatní znaky. */   }

%%
/*** Oblast kódu v jazyce C ***/

int main(void)
{
    /* Zavolá lexikální analýzu a ukončí se. */
    yylex();
    return 0;
}

Po zpracování vstupu Flexem výstupem zdrojový kód v jazyce C (lex.yy.c), který může být přeložen do spustitelného programu, který na výstup vypíše všechny řetězce čísel, které na svém vstupu nalezne. Příklad vstupu:

abc123z.!&*2ghj6

program vypíše:

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

Využití Lexu s jinými nástroji pro programování

Využití Lexu společně se syntaktickým analyzátorem

Lex a syntaktické analyzátory, jako je například yacc nebo Bison, se často využívají společně. Analyzátor využívá formální gramatiku pro analýzu vstupu. Tato operace není snadno proveditelná pomocí Lexu, který využívá regulární výrazy (Lex je pouze jednoduchý konečný automat). Nicméně syntaktický analyzátor není schopen číst z prostého vstupu, vyžaduje sérii tokenů. Lex je často používán jako poskytovatel těchto tokenů.

Lex a make

Program make je nástroj, který může pro správu zdrojových kódů využít Lex, protože předpokládá, že soubor s příponou .l je zdrojový kód pro Lex. Interní makro LFLAGS pak může být programem make využito pro předání přepínačů a voleb programu Lex, který je příkazem make automaticky spouštěn.[3]

Reference

  1. LEVINE, John R; MASON, Tony; BROWN, Doug. LEX & YACC. 2. vyd. [s.l.]: O'Reilly, 1992. Dostupné online. ISBN 1-56592-000-7. S. 1–2. 
  2. LEVINE, John. flex & bison. [s.l.]: O'Reilly Media, August 2009. Dostupné online. ISBN 978-0-596-15597-1. S. 304. 
  3. make. The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. The IEEE and The Open Group, 2004. Dostupné online. 

Související články

Externí odkazy

V tomto článku byl použit překlad textu z článku Lex_(software) na anglické Wikipedii.