Lex (software): Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
m Přidána kategorie informatika
JAnDbot (diskuse | příspěvky)
m robot přidal: ko:Lex odebral: fr:Lex et yacc; kosmetické úpravy
Řádek 6: Řádek 6:
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.
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 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.
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.
Řádek 16: Řádek 16:
''Oblast kódu v jazyce C''
''Oblast kódu v jazyce C''


*Oblast '''definice''' je určena pro difinici [[Makro_(software)|maker]] a import [[Hlavičkový_soubor|hlavičkových souborů]] v jazyce [[Programovací_jazyk_C|C]]. Je zde možno zapsat i kód jazyka C, který bude bezezměn vložen do vygenerovaného souboru.
* Oblast '''definice''' je určena pro difinici [[Makro (software)|maker]] a import [[Hlavičkový soubor|hlavičkových souborů]] v jazyce [[Programovací jazyk C|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í_výraz|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 '''pravidel''' je nejdůležitější, protože jsou zde umístěny vzory, které jsou v podstatě [[Regulární výraz|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_(programování)|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řekladač|překladu]].
* Oblast '''kódu v jazyce C''' obsahuje příkazy a [[Funkce (programování)|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řekladač|překladu]].


==Příklad souboru pro lex==
== Příklad souboru pro lex ==
Následující kód je ukázkou vstupního lex souboru pro verzi [[Flex_lexical_analyser|Flex]], která je jednou z verzí lexu. Dokáže rozpoznat řetězce čísel na vstupu a poté je zobrazit na výstupu.
Následující kód je ukázkou vstupního lex souboru pro verzi [[Flex lexical analyser|Flex]], která je jednou z verzí lexu. Dokáže rozpoznat řetězce čísel na vstupu a poté je zobrazit na výstupu.


<pre>/*** Oblast definice ***/
<pre>/*** Oblast definice ***/
Řádek 63: Řádek 63:
Saw an integer: 6
Saw an integer: 6


==Využití Lexu s jinými nástroji pro programování==
== Využití Lexu s jinými nástroji pro programování ==
===Využítí Lexu společně se syntaktickým analyzátorem===
=== Využítí Lexu společně se syntaktickým analyzátorem ===
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]]. 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]]
*[[:en:Quex|Quex]]
* [[:en:Quex|Quex]]
*[[:en:List of C Sharp lexer generators|List of C# lexer generators]]
* [[:en:List of C Sharp lexer generators|List of C# lexer generators]]


== Externí odkazy ==
== Externí odkazy ==
*[http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ Using Flex and Bison at Macworld.com]
* [http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ Using Flex and Bison at Macworld.com]


{{překlad|en|Lex_(software)|350504908}}
{{překlad|en|Lex_(software)|350504908}}
Řádek 88: Řádek 88:


[[de:Lex (Informatik)]]
[[de:Lex (Informatik)]]
[[en:Lex_(software)]]
[[en:Lex (software)]]
[[es:Lex (informática)]]
[[es:Lex (informática)]]
[[fa:لکس]]
[[fa:لکس]]
[[fr:Lex et yacc]]
[[hu:Lex (informatika)]]
[[hu:Lex (informatika)]]
[[ja:Lex]]
[[ja:Lex]]
[[ko:Lex]]
[[nl:Lex (computerprogramma)]]
[[nl:Lex (computerprogramma)]]
[[pl:Lex (informatyka)]]
[[pl:Lex (informatyka)]]

Verze z 30. 4. 2010, 07:50

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.