Lexikální analýza
Ve vědě o počítačích, lexikální analýza je proces konvertování sled charakterů do sledu známek. Předvádění programů lexikální analýza být nazýván lexikálními analyzátory nebo lexers. Lexer je často organizován jako oddělený skener a funkce tokenizer, ačkoli hranice nemohou být jasně definované.
Nepřehlédněte: Tato stránka obsahuje strojový překlad textu z anglické encyklopedie Wikipedia. Pokud budou některé pasáže špatně srozumitelné, zkuste se podívat i na text v originále, který najdete pod odkazem Lexical analysis. Překlad byl vytvořen pomocí překladače Eurotran.
Lexikální gramatika
Specifikace programovacího jazyka bude zahrnovat soubor pravidel, často vyjadřoval syntactically, specifikovat soubor možných charakterových sekvencí, které mohou tvořit známku nebo lexeme. Whitespace charaktery jsou často ignorovány během lexikální analýzy.
Známka
Známka je roztříděný blok textu. Blok textu odpovídajícího známce je známý jako lexeme. Lexikální analyzátor zpracuje lexemes roztřídit je podle funkce, dávat jim význam. Tento převod významu je známý jako tokenization. Známka může vypadat jako něco; to jen potřebuje být užitečný díl uspořádaného textu.
Zvažovat tento výraz v C programovací jazyk:
Tokenized v následující tabulce:
Známky jsou často definované pravidelnými výrazy, který být rozuměl pod lexikálním analyzátorem generátor takový jak lex. Lexikální analyzátor (jeden vytvořený automaticky nástrojem jako lex nebo ruka-crafted) načítá proud charakterů, pozná lexemes v potoku, a roztřídí je do známek. Toto je voláno “tokenizing.” jestliže lexer najde invalidní známku, to ohlásí chybu.
Následující tokenizing rozebere. Odtamtud, interpretovaná data mohou být načtena do datových struktur, pro veřejné používání, výklad, nebo kompilovat.
Skener
První stádium, skener, je obvykle založený na konečném státním stroji. To kódovalo uvnitř toho informace o možných sledech charakterů, které mohou být obsahovala uvnitř některého známek to se ovládá (individuální příklady těchto sekvencí charakteru jsou známé jako lexemes). Například, známka celého čísla může obsahovat nějaký sled numerických číslových charakterů. V mnoha případech, první non-charakter whitespace může být používán odvodit druh známky, která následuje a následující vstup charaktery jsou pak zpracovaný v době do doby, než dosáhne charakteru, který není v souboru charakterů přijatelných pro tu známku (toto je znáno jak maximal žvýkat pravidlo). V některých jazycích lexeme vytvoření vládne být více komplikovaný a smět zahrnovat ústupek přes předtím četly charaktery.
Tokenizer
Tokenization je proces vyznačovat a možná třídit části řetězu charakterů vstupu. Výsledné známky jsou pak předány k nějaké jiné formě zpracování. Proces může být považován za náhradníka-úloha rozebrat vstup.
Brát, například, následující řetězec. Na rozdíl od lidí, počítač nemůže intuitivně ' vidět ' to tam je 9 slov. K počítači toto je jen série 43 charakterů.
Proces tokenization mohl být zvyklý na rozkol věta do známek slova. Ačkoli následování příkladu je dáváno jako XML tam je mnoho způsobů, jak reprezentovat tokenized vstup:
< věta > < slovo >< / slovo > < slovo >rychle< / slovo > < slovo >hnědý< / slovo > < slovo >liška< / slovo > < slovo >skoky< / slovo > < slovo >přes< / slovo > < slovo >< / slovo > < slovo >lenivý< / slovo > < slovo >pes< / slovo > < / věta >
Lexeme, nicméně, je jen řetěz charakterů známý být z jistém druhu (eg, řetězec doslovný, sled dopisů). Aby budoval známku, lexikální analyzátor potřebuje druhé stádium, evaluator, který projde charaktery lexeme produkovat hodnotu. Typ lexeme spojený s jeho hodnotou je co vhodně představuje známku, který může být náchylný k analyzátoru. (některé známky takový jak parentheses opravdu nemají hodnoty, a tak evaluator funkce pro tyto může vrátit nic. Evaluators pro celá čísla, identifikátory a řetězce mohou být značně komplexnější. Někdy evaluators může potlačit lexeme úplně, ukrývat to před analyzátorem, který je užitečný pro whitespace a poznámky.)
Například, ve zdrojovém kódu počítačového programu řetězec
směl být změněn (s whitespace potlačil) do lexikálního známkového potoku:
Jméno “síť _ hodnota _ budoucnost” Se rovná Otevřený _ závorka Jmenovat “jmění” Minus Jmenovat “závaznosti” Blízko _ závorka Středník
Ačkoli to je možné a někdy nutný psát lexer po ruce, lexers jsou často vytvořeny automatizovanými nástroji. Tyto nástroje obecně přijímají pravidelné výrazy, které popisují známky dovolené v potoku vstupu. Každý pravidelný výraz je spojován s výrobou v lexikální gramatice programovacího jazyka, který ocení lexemes odpovídat pravidelnému výrazu. Tyto nástroje mohou tvořit zdrojový kód, který může být zkompilovaný a provedený nebo budovat státní stůl pro konečný státní stroj (který je zapojen do šablonového kódu kompilace a provádění).
Pravidelný compactly výrazů reprezentují vzory to charaktery v síle lexemes znamenají. Například, pro angličtinu-založený jazyk, známka jména by mohla být nějaký anglický abecední charakter nebo podtrhnout, následovaný nějakým množstvím příkladů nějakého ASCII alfanumerického znaku nebo podtrhnout. Toto mohlo být reprezentováno compactly řetězcem [- zA-Z _] [- zA-Z _ 0-9] *. Toto znamená “nějaký charakter-z,-Z nebo _, následoval 0 nebo více-z,-Z, _ nebo 0-9”.
Pravidelné výrazy a konečné státní stroje, které oni tvoří nejsou silní dost se zabývat rekurzivními vzory, takový jak “n otevření parentheses, následovaný sdělením, následoval n uzavření parentheses.” oni nejsou schopní počtu udržování a přezkoušení to n je stejný na obou stranách — ledaže vy máte konečný soubor dovolených hodnot pro n. to vyžaduje dospělý analyzátor rozpoznat takové vzory v jejich plné všeobecnosti. Analyzátor může tlačit parentheses na hromadě a pak pokusit se vyjmout je pryč a vidět jestliže hromada je prázdná na konci.
Lex programovat nástroj a jeho kompilátora je navrhnut tvořit kód rychle lexikálních analyzátorů založených na formálním druhu lexikální syntaxe. To není obecně zvážil to dostatečný pro aplikace s komplikovaným souborem lexikálních pravidel a hrozných výkonových požadavků; například, GNU překladačová sbírka používá ruku-psané lexers.
Lexer generátor
Lexikální analýza může často být vykonávána v jediném povolení jestliže četba je dělána charakter v době. Jeden-lexers povolení může být vytvořen nástroji takový jako klasický kabel.
Lex/ohnout rodinu generátorů používá stůl-řízený přístup který je hodně méně výkonný než přímo kódovaný přístup. S druhým nástupem generátor produkuje motor, který přímo skočí ke státům pokračování přes goto sdělení. Nástroje mají rád re2c a Quex ukázal se jako (např. článek o re2c) k motorům produkce, které jsou mezitím dva ke třem časům rychleji než kabel produkoval motory. To je obecně obtížný podat-psát analyzátory, které hrají zlepší než motory vytvořené těmito druhými nástroji.
Jednoduchá pomůcka používání generátor skeneru by neměl být zlevněn, obzvláště ve vývojové fázi, když specifikace jazyka by mohla měnit se denně. Schopnost vyjadřovat lexikální pojmy jako pravidelné výrazy usnadní druh lexikálního analyzátoru. Některé nástroje nabídnou specifikaci pre - a pošta-podmínky, které jsou usilovně k programu po ruce. V tom případě, používat skener generátor může ukládat hodně času vývoje.
Lexikální generátory analyzátoru
- Kabel - alternativní varianta klasiky ' lex ' (C/C + +).
- JLex - lexikální analyzátor generátor pro Javu.
- JFlex - přepsání JLex.
- Quex - (nebo ' Queχ ') režim určoval lexikální analyzátor generátor pro C + +.
- Ragel - stroj státu a lexikální skenerový generátor s výstupem podpírají pro C, C + +, cíl-C, D, Java a Ruby zdrojový kód
Viz též
Odkazy
- CS 164: Programovat jazyky a kompilátory (poznámky třídy # 2: Lexikální)
- Kompilovat s C # a Java, Pat Terry, 2005, ISBN 0-321-26360-X 624
- Algoritmy + datové struktury = programy, Niklaus Wirth, 1975, ISBN 0-13-022418-9
- Překladačová stavba, Niklaus Wirth, 1996, ISBN 0-201-40353-6
- Sebesta, R. W. (2006). Představy o programovacích jazycích (sedmé vydání) pp.177. Boston: Pearson/Addison-Wesley.