Lex (software)
Author
Albert FloresLex je v informatice program sloužící pro generování lexikálních analyzátorů. Č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. +more * 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 %}
/* 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. +morec), 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. +more 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. +more 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.
Reference
Související články
Externí odkazy
http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ Používáme Flex a Bison (Macworld.com, anglicky)
Kategorie:Generátory lexikálních analyzátorů Kategorie:Konečné automaty Kategorie:Programovací software Kategorie:Unixové programátorské nástroje