Lex (software): Porovnání verzí

Přidáno 125 bajtů ,  před 12 lety
Formulace, styl
m (robot přidal: ko:Lex odebral: fr:Lex et yacc; kosmetické úpravy)
(Formulace, styl)
{{Upravit}}
V informatice'''Lex''' je lexv [[Informatika (počítačová věda)|informatice]] [[Počítačový program|program]] sloužící pro generování [[Lexikální analýza|lexikálních analyzátorů]]. Často se využívá také společně s generátorem [[Syntaktická analýza|syntaktických analyzátorů]], programem [[yacc]]. Lex vytvořil Eric Schmidt a Mike Lesk. Je toběžnou lexikálnísoučástí analyzátor,mnoha který[[UN*X|unixových]] jesystémů a stal se součástí mnohastandardu Unix[[POSIX]]. systémůPřestože aje Lex tradičně proprietární nástroj, proexistují ukázkuverze chovánízaložené specifickýchna částípůvodním standardu[[Zdrojový POSIXkód|kódu]] od [[AT&T]] jako [[Open source software|open source]] v rámci systémů [[Solaris (operační systém)|OpenSolaris]] a [[Plan 9 from Bell Labs]]. Velmi populární open source variantou
 
Lex naNa vstupu čte Lex specifikaci lexikálního analyzátoru a na výstupu poskytuje k němu poskytuje zdrojový kód v [[C (programovací jazyk)|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 vstupu je záměrně velice podobná souboruvýstupu pro výše zmíněnýprogramu [[yacc]]. Soubor je rozdělen do tří oblastíčástí (sekcí), oddělenýchkteré dvoumijsou vzájemně odděleny dvěma znaky procenta '(„%%'“), jak ukazuje následující příklad.
 
''Sekce definic''
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''
%%
''OblastSekce pravidel''
%%
''OblastSekce 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 '''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.
 
* OblastSekce '''definice''': je určena pro difinicidefinici [[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ěnbeze změn vložen do vygenerovaného souboru.
* 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]].
* OblastSekce '''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 schodashoda na vstupu s daným regulárním výrazem. Toto je základ toho jak lex funguje.
* OblastSekce '''kódu v jazyce C''': obsahuje příkazy a [[Funkce (programování)|funkce]], které jsou bezezmněnybeze změny zkopírovány do výsledného souboru. Příkazy jsou defaktode 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 nalikonkovatnalinkovat ve chvíli [[Překladač|překladu]].
 
== 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.
 
}</pre>
<pre>/*** Oblast definice ***/
''/*** Oblast definice'' ***/
 
%{
yylex();
return 0;
}
}</pre>
</pre>
 
Po předánízpracování vstupu flexuFlexem jevýstupem tentozdrojový vstupkód konvertovánv do souboru jazykajazyce C, (<code>lex.yy.c.</code>), Tento výsledekkterý může být [[Překladač|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:
 
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
 
== Využití Lexu s jinými nástroji pro programování ==
=== VyužítíVyužití 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í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řídících znaků. Lex je často používán, jako poskytovatel analyzátoru s těmito znaky.
 
== Související články ==
 
* [[Flex lexical analyser]]
* [[Yacc]]
 
== Související články v angličtině ==
 
* [[:en:Ragel|Ragel]]
* [[:en:Quex|Quex]]
* [[:en:List of C Sharp lexer generators|List of C# lexer generators]]
 
== Externí odkazy ==
* [http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/ UsingPoužíváme Flex anda Bison at (Macworld.com], anglicky)
 
{{překlad|en|Lex_(software)|350504908}}