Invia.cz
Last minute
Tunisko
Dovolená v Chorvatsku
Pojeďte do Egypta
Bulharsko
Vydělávejte peníze s INVIA.CZ
Lexikální analýza je činnost, kterou provádí tzv. lexikální analyzátor (scanner) - je součástí překladače. Lexikální analyzátor rozdělí vstupní posloupnost znaků na lexémy - lexikální jednotky (např. identifikátory, čísla, klíčová slova, operátory, …). Tyto lexémy jsou reprezentovány ve formě tokenů, ty jsou poskytnuty ke zpracování syntaktickému analyzátoru.
Úkolem lexikálního analyzátoru je také odstranění komentářů a bílých znaků ze zdrojového programu.
V praxi je lexikální analyzátor realizován pomocí konečného automatu.
Obsah |
Lexikální analyzátor je vstupní a nejjednodušší částí překladače. Čte ze vstupního souboru znaky reprezentující zdrojový program a z těchto znaků vytváří symboly programu, což je forma vhodná pro zpracování syntaktickou analýzou. Provádí tedy překlad posloupnosti znaků vstupního textu do posloupnosti symbolů na výstupu. Kromě této základní funkce lexikální analyzátor provádí obvykle i výpis (listing) zdrojového programu a vynechává zbytečné znaky z hlediska programu (mezery, poznámky apod.). Symboly na výstupu lexikální analýzy si můžeme představit jako dvojice (sym, atr), kde sym je jméno (identifikace) symbolu a atr představuje případný atribut (u symbolů bez atribut je atr prázdné).
Z hlediska implementace v jazyku Pascal je vstupem lexikálního analyzátoru textový soubor (file of char) a výstupem posloupnost symbolů (tokens), přičemž
type Token = record SYM: SYMBOL; {jméno rozpoznaného symbolu} ATR: STR; {atribut symbolu} end;
Typ SYMBOL je datový typ definovaný výčtem, který obsahuje jména všech symbolů rozpoznaných lexikální analýzou. Typ STR je abstraktní datový typ řetězce. Cílem návrhu lexikálního analyzátoru je vytvořit proceduru:
procedure TOKGET(var T: TOKEN);
Předávající při každém volání jeden symbol T rozpoznaný ve vstupním textu.
| Token | Lexém | Regulární výraz |
|---|---|---|
| while | while | while |
| relop | <, <=, =, <>, >, >= | \<|\<=|\<>|>|>= |
| uint | 0, 123 | [0-9]+ |
| /*komentář*/ | \/\*—> cmt, <cmt>., <cmt>\*\/ |
Existuji automatické nástroje pro tvorbu lexikálních analyzátorů, např. Lex, Flex
Jak bylo uvedeno dříve, lexikální analyzátor provádí překlad vstupního textu na posloupnost symbolů. Víme, že stavbu jednotlivých symbolů lze obvykle popsat regulární gramatikou. Lexikální analyzátor je pak tvořen deterministickým konečným automatem (též DKA). Opakovanou činností procesoru nad tímto DKA získáme hledanou posloupnost symbolů. Identifikace přijatého symbolu se bude provádět podle koncového stavu automatu, v němž pro daný symbol procesor skončil svou činnost.
Během chodu DKA může dojít k chybě. Chyba vznikne, pokud pro znak pod čtecí hlavou DKA neexistuje žádná větev vedoucí ze stavu, ve kterém se procesor nad DKA nachází a zároveň tento stav není koncový.
Nelze předem předpokládat, kterou z chyb na daném místě programátor udělá, proto se obvykle ošetřuje chyba vynecháním chybného znaku a na výstup lexikálního analyzátoru se odevzdá speciální symbol (NULSYM). Tím se zotavením po chybě odsune do fáze syntaktické analýzy. Existují i metody známé z teorie informace (Hammingova vzdálenost), které mohou sloužit k opravě některých lexikálních chyb.