Co je lexikální analýza?
LEXICKÁ ANALÝZA je úplně první fází při navrhování kompilátoru. Lexer vezme upravený zdrojový kód, který je napsán ve formě vět. Jinými slovy vám pomůže převést sekvenci znaků na sekvenci tokenů. Lexikální analyzátor rozdělí tuto syntaxi na řadu tokenů. Odstraní veškerý další prostor nebo komentář napsaný ve zdrojovém kódu.
Programy provádějící lexikální analýzu se nazývají lexikální analyzátory nebo lexery. Lexer obsahuje tokenizer nebo skener. Pokud lexikální analyzátor zjistí, že token je neplatný, generuje chybu. Čte proudy znaků ze zdrojového kódu, kontroluje legální tokeny a předává data analyzátoru syntaxe, když to vyžaduje.
Příklad
How Pleasant Is The Weather?
Viz tento příklad; Zde můžeme snadno rozpoznat, že existuje pět slov Jak příjemné je počasí. To je pro nás velmi přirozené, protože můžeme rozpoznat oddělovače, mezery a interpunkční symbol.
HowPl easantIs Th ewe ather?
Nyní, podívejte se na tento příklad, můžeme si také přečíst. Bude to však nějakou dobu trvat, protože do Odd places jsou umístěny oddělovače. Není to něco, co k vám přijde okamžitě.
V tomto výukovém programu se naučíte
- Základní terminologie:
- Architektura Lexical Analyzer: Jak jsou rozpoznávány tokeny
- Role Lexikálního analyzátoru
- Lexikální chyby
- Obnova po chybě v Lexical Analyzer
- Lexikální analyzátor vs. analyzátor
- Proč oddělit Lexical a Parser?
- Výhody lexikální analýzy
- Nevýhoda lexikální analýzy
Základní terminologie
Co je lexéma?
Lexemie je posloupnost znaků, které jsou zahrnuty ve zdrojovém programu podle shodného vzoru tokenu. Není to nic jiného než instance tokenu.
Co je to token?
Token je posloupnost znaků, která představuje jednotku informací ve zdrojovém programu.
Co je to vzor?
Vzor je popis, který používá token. V případě klíčového slova, které používá jako token, je vzor posloupností znaků.
Architektura Lexical Analyzer: Jak jsou rozpoznávány tokeny
Hlavním úkolem lexikální analýzy je číst vstupní znaky v kódu a vytvářet tokeny.
Lexikální analyzátor skenuje celý zdrojový kód programu. Identifikuje každý token jeden po druhém. Skenery jsou obvykle implementovány tak, aby produkovaly tokeny, pouze pokud o to požádá analyzátor. Takto to funguje -
- „Získat další token“ je příkaz, který je odeslán z analyzátoru do lexikálního analyzátoru.
- Po obdržení tohoto příkazu lexikální analyzátor skenuje vstup, dokud nenajde další token.
- Vrací token do analyzátoru.
Lexical Analyzer při vytváření těchto tokenů přeskočí mezery a komentáře. Pokud je přítomna nějaká chyba, pak Lexikální analyzátor tuto chybu porovná se zdrojovým souborem a číslem řádku.
Role Lexikálního analyzátoru
Lexikální analyzátor provádí níže uvedené úkoly:
- Pomáhá identifikovat token do tabulky symbolů
- Odebere mezery a komentáře ze zdrojového programu
- Korelační chybové zprávy se zdrojovým programem
- Pomůže vám rozšířit makra, pokud se nacházejí ve zdrojovém programu
- Přečtěte si vstupní znaky ze zdrojového programu
Příklad lexikální analýzy, tokeny, jiné než tokeny
Zvažte následující kód, který se přivádí do Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Příklady vytvořených tokenů
Lexeme | Žeton |
int | Klíčové slovo |
maximum | Identifikátor |
( | Operátor |
int | Klíčové slovo |
X | Identifikátor |
, | Operátor |
int | Klíčové slovo |
Y | Identifikátor |
) | Operátor |
{ | Operátor |
Li | Klíčové slovo |
Příklady Nontokens
Typ | Příklady |
Komentář | // Porovná se 2 čísla |
Směrnice před zpracováním | #include |
Směrnice před zpracováním | #define NUMS 8,9 |
Makro | NUM |
Mezery | / n / b / t |
Lexikální chyby
Posloupnost znaků, kterou není možné naskenovat do žádného platného tokenu, je lexikální chybou. Důležitá fakta o lexikální chybě:
- Lexikální chyby nejsou příliš časté, ale měly by být spravovány skenerem
- Nesprávný pravopis identifikátorů, operátorů, klíčových slov se považuje za lexikální chyby
- Obecně je lexikální chyba způsobena výskytem nějakého nelegálního znaku, většinou na začátku tokenu.
Obnova po chybě v Lexical Analyzer
Zde je několik nejběžnějších technik obnovy chyb:
- Odebere jeden znak ze zbývajícího vstupu
- V režimu paniky jsou následující znaky vždy ignorovány, dokud nedosáhneme dobře vytvořeného tokenu
- Vložením chybějícího znaku do zbývajícího vstupu
- Nahraďte znak jiným znakem
- Transponujte dva sériové znaky
Lexikální analyzátor vs. analyzátor
Lexikální analyzátor | Analyzátor |
Program pro skenování vstupu | Proveďte syntaktickou analýzu |
Identifikujte tokeny | Vytvořte abstraktní reprezentaci kódu |
Vložte žetony do tabulky symbolů | Aktualizujte položky tabulky symbolů |
Generuje lexikální chyby | Generuje syntaktický strom zdrojového kódu |
Proč oddělit Lexical a Parser?
- Jednoduchost designu: Usnadňuje proces lexikální analýzy a syntaktické analýzy tím, že eliminuje nežádoucí tokeny
- Zlepšení efektivity kompilátoru: Pomůže vám zlepšit efektivitu kompilátoru
- Specializace: ke zlepšení procesu lexikální analýzy lze použít specializované techniky
- Přenositelnost: ke komunikaci s vnějším světem vyžaduje pouze skener
- Vyšší přenositelnost: zvláštnosti specifické pro vstupní zařízení omezené na lexera
Výhody lexikální analýzy
- Metodu lexikálního analyzátoru používají programy jako kompilátory, které mohou pomocí analyzovaných dat z kódu programátoru vytvořit kompilovaný binární spustitelný kód
- Používají jej webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z Javscript, HTML, CSS
- Samostatný lexikální analyzátor vám pomůže postavit specializovaný a potenciálně efektivnější procesor pro daný úkol
Nevýhoda lexikální analýzy
- Musíte strávit značný čas čtením zdrojového programu a jeho rozdělením ve formě tokenů
- Některé regulární výrazy jsou ve srovnání s pravidly PEG nebo EBNF obtížně pochopitelné
- Je třeba vyvinout větší úsilí při vývoji a ladění lexeru a jeho popisů tokenů
- Ke generování tabulek lexerů a konstrukci tokenů je zapotřebí další runtime režie
souhrn
- Lexikální analýza je úplně první fází při navrhování kompilátoru
- Lexemie je posloupnost znaků, které jsou zahrnuty ve zdrojovém programu podle shodného vzoru tokenu
- Lexikální analyzátor je implementován ke skenování celého zdrojového kódu programu
- Lexikální analyzátor pomáhá identifikovat token do tabulky symbolů
- Posloupnost znaků, kterou není možné naskenovat do žádného platného tokenu, je lexikální chybou
- Odebere jeden znak ze zbývajícího vstupu je užitečná metoda zotavení po chybě
- Lexikální analyzátor skenuje vstupní program, zatímco analyzátor provádí syntaktickou analýzu
- Usnadňuje proces lexikální analýzy a syntaktické analýzy tím, že eliminuje nežádoucí tokeny
- Lexikální analyzátor používají webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z Javscript, HTML, CSS
- Největší nevýhodou použití Lexikálního analyzátoru je to, že ke generování tabulek lexeru a konstrukci tokenů je zapotřebí další runtime režie