Lex (software): Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
m {{Upravit}}
m Úprava hierarchie
Řádek 67: Řádek 67:
Lex a syntaktické analyzátory, jako je například [[yacc]] nebo [[GNU_bison|Bison]], se často využívají společně. Analyzátor využívá [[Formální_gramatika|Formální gramatiku]] pro analýzu vstupu. Tato operace není snadno proveditelná pomocí lexu, který využívá [[Regulární_výraz|regulární výrazy]]. Dále je omezen tím, že lex je [[Konečný_automat|konečný automat]]. Nicméně syntaktický analyzátor není schopen číst z prostého vstupu, vyžaduje sérii řícidích znaků. Lex je často používán, jako poskytovatel analyzátoru s těmito znaky.
Lex a syntaktické analyzátory, jako je například [[yacc]] nebo [[GNU_bison|Bison]], se často využívají společně. Analyzátor využívá [[Formální_gramatika|Formální gramatiku]] pro analýzu vstupu. Tato operace není snadno proveditelná pomocí lexu, který využívá [[Regulární_výraz|regulární výrazy]]. Dále je omezen tím, že lex je [[Konečný_automat|konečný automat]]. Nicméně syntaktický analyzátor není schopen číst z prostého vstupu, vyžaduje sérii řícidích znaků. Lex je často používán, jako poskytovatel analyzátoru s těmito znaky.


=== Související články ===
== Související články ==


*[[Flex lexical analyser]]
*[[Flex lexical analyser]]
*[[Yacc]]
*[[Yacc]]


=== Související články v angličtině ===
== Související články v angličtině ==


*[[:en:Ragel|Ragel]]
*[[:en:Ragel|Ragel]]

Verze z 29. 4. 2010, 20:07

V informatice je lex program sloužící pro generování lexikálních analyzátorů. Často se využívá také společně s generátorem syntaktických analyzátorů yacc. Lex vytvořil Eric Schmidt a Mike Lesk. Je to lexikální analyzátor, který je součástí mnoha Unix systémů a nástroj pro ukázku chování specifických částí standardu POSIX.

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

Podobně jako většina takovéhoto softwaru, jsou i zdrojové kódy volně k dispozici. Lex je součástí operačního systému OpenSolaris a Plan 9 z Bell Labs. Jednou z dalších verzí je i Flex.

Struktura lex souboru

Struktura je velice podobná souboru pro výše zmíněný yacc. Soubor je rozdělen do tří oblastí, oddělených dvoumi znaky procenta '%', jak ukazuje následující příklad.

Oblast definice
%%
Oblast pravidel
%%
Oblast kódu v jazyce C
  • Oblast definice je určena pro difinici maker a import hlavičkových souborů v jazyce C. Je zde možno zapsat i kód jazyka C, který bude bezezměn vložen do vygenerovaného souboru.
  • Oblast 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 schoda na vstupu s daným regulárním výrazem. Toto je základ toho jak lex funguje.
  • Oblast kódu v jazyce C obsahuje příkazy a funkce, které jsou bezezmněny zkopírovány do výsledného souboru. Příkazy jsou defakto 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 nalikonkovat ve chvíli překladu.

Příklad souboru pro lex

Následující kód je ukázkou vstupního lex souboru pro verzi 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 předání vstupu flexu je tento vstup konvertován do souboru jazyka C, lex.yy.c. Tento výsledek může být přeložen do spustitelného programu, který na výstup vypíše všechny řetězce čísel. 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žítí 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. Dále je omezen tím, že lex je konečný automat. Nicméně syntaktický analyzátor není schopen číst z prostého vstupu, vyžaduje sérii řícidích znaků. Lex je často používán, jako poskytovatel analyzátoru s těmito znaky.

Související články

Související články v angličtině

Externí odkazy

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