Lex (software)

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Lex 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

Flex lexical analyser * Yacc

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

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top