Lexikální analýza (analyzátor) v návrhu kompilátoru s příkladem
Co je lexikální analýza?
Lexikální analýza je úplně první fází při navrhování kompilátoru. Lexer převezme upravený zdrojový kód, který je napsán ve formě vět. Jinými slovy, pomáhá vám převést posloupnost znaků na posloupnost tokenů. Lexikální analyzátor rozdělí tuto syntaxi na řadu tokenů. Odstraní všechny mezery nebo komentáře zapsané ve zdrojovém kódu.
Programy, které provádějí lexikální analýzu v návrhu kompilátoru, se nazývají lexikální analyzátory nebo lexery. Lexer obsahuje tokenizér nebo skener. Pokud lexikální analyzátor zjistí, že token je neplatný, vygeneruje chybu. Úlohou Lexical Analyzer v návrhu kompilátoru je číst proudy znaků ze zdrojového kódu, kontrolovat legální tokeny a předávat data syntaktickému analyzátoru, když to vyžaduje.
Příklad
How Pleasant Is The Weather?
Viz tento příklad Lexikální analýzy; Zde snadno poznáme, že existuje pět slov How Pleasant, The, Weather, Is. To je pro nás velmi přirozené, protože dokážeme rozpoznat oddělovače, mezery a symbol interpunkce.
HowPl easantIs Th ewe ather?
Nyní se podívejte na tento příklad, můžeme si to také přečíst. Bude to však nějakou dobu trvat, protože oddělovače jsou umístěny na Odd Places. Není to něco, co k vám přijde okamžitě.
Základní terminologie
Co je to lexém?
Lexém 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?
Tokeny v designu kompilátoru jsou sekvence znaků, které představují jednotku informace ve zdrojovém programu.
Co je vzor?
Vzor je popis, který používá token. V případě klíčového slova, které se používá jako token, je vzorem sekvence znaků.
Lexikální analyzátor Architecture: Jak se rozpoznávají tokeny
Hlavním úkolem lexikální analýzy je číst vstupní znaky v kódu a vytvářet tokeny.
Lexikální analyzátor prohledá celý zdrojový kód programu. Identifikuje každý token jeden po druhém. Skenery jsou obvykle implementovány tak, aby produkovaly tokeny pouze na žádost analyzátoru. Zde je návod, jak funguje rozpoznávání tokenů v návrhu kompilátoru –
- „Get next token“ je příkaz, který je odeslán z analyzátoru do lexikálního analyzátoru.
- Po přijetí tohoto příkazu lexikální analyzátor prohledává vstup, dokud nenajde další token.
- Vrátí token do analyzátoru.
Lexical Analyzer při vytváření těchto tokenů přeskakuje mezery a komentáře. Pokud je přítomna jakákoli chyba, pak Lexikální analyzátor koreluje tuto chybu 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 ze zdrojového programu bílá místa a komentáře
- Koreluje chybové zprávy se zdrojovým programem
- Pomůže vám rozšířit makra, pokud je nalezena ve zdrojovém programu
- Přečtěte si vstupní znaky ze zdrojového programu
Příklad lexikální analýzy, tokeny, non-tokeny
Zvažte následující kód, který je přiváděn do Lexical Analyzer
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Příklady vytvořených tokenů
Lexeme | Známka |
---|---|
int | Klíčové slovo |
maximum | identifikátor |
( | OperaTor |
int | Klíčové slovo |
x | identifikátor |
, | OperaTor |
int | Klíčové slovo |
Y | identifikátor |
) | OperaTor |
{ | OperaTor |
If | Klíčové slovo |
Příklady Nontokens
Typ | Příklady |
---|---|
Komentář | // Toto porovná 2 čísla |
Předprocesorová směrnice | #zahrnout |
Předprocesorová směrnice | #define NUMS 8,9 |
Makro | NUMS |
Whitespace | /n /b /t |
Lexikální chyby
Sekvence znaků, kterou nelze naskenovat do žádného platného tokenu, je lexikální chyba. Důležitá fakta o lexikální chybě:
- Lexikální chyby nejsou příliš časté, ale měly by být spravovány skenerem
- Překlepy v identifikátorech, operátorech, klíčových slovech jsou považovány za lexikální chyby
- Obecně je lexikální chyba způsobena výskytem nějaké nelegální postavy, většinou na začátku tokenu.
Obnova 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 panickém režimu jsou po sobě následující postavy 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. Parser
Lexikální analyzátor | Parser |
---|---|
Program Scan Input | Proveďte analýzu syntaxe |
Identifikujte tokeny | Vytvořte abstraktní reprezentaci kódu |
Vložte žetony do tabulky symbolů | Aktualizujte položky tabulky symbolů |
Vytváří lexikální chyby | Generuje strom analýzy zdrojového kódu |
Proč oddělovat Lexical a Parser?
- Jednoduchost designu: Usnadňuje proces lexikální analýzy a syntaktické analýzy odstraněním nežádoucích tokenů
- Zlepšení efektivity kompilátoru: Pomáhá zlepšit efektivitu kompilátoru
- Specializace: specializované techniky lze použít ke zlepšení procesu lexikální analýzy
- Přenositelnost: pouze skener vyžaduje komunikaci s vnějším světem
- Vyšší přenositelnost: zvláštnosti specifické pro vstupní zařízení jsou omezeny na lexer
Výhody Lexikální analýzy
- Metodu lexikálního analyzátoru používají programy, jako jsou kompilátory, které mohou použít analyzovaná data z kódu programátora k vytvoření zkompilovaného binárního spustitelného kódu.
- Používají jej webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z JavaScript, HTML, CSS
- Samostatný lexikální analyzátor vám pomůže vytvořit 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 poměrně obtížné pochopit
- K vývoji a ladění lexeru a jeho popisů tokenů je zapotřebí více úsilí
- Ke generování lexerových tabulek a konstrukci tokenů je vyžadována další provozní režie
Shrnutí
- Lexikální analýza je úplně první fází návrhu kompilátoru
- Lexemy a tokeny jsou posloupností znaků, které jsou zahrnuty ve zdrojovém programu podle shodného vzoru tokenu.
- Lexikální analyzátor je implementován pro skenování celého zdrojového kódu programu
- Lexikální analyzátor pomáhá identifikovat token do tabulky symbolů
- Sekvence znaků, kterou nelze naskenovat do žádného platného tokenu, je lexikální chyba
- Odstranění jednoho znaku ze zbývajícího vstupu je užitečná metoda zotavení po chybě
- Lexical Analyzer skenuje vstupní program, zatímco parser provádí analýzu syntaxe
- Usnadňuje proces lexikální analýzy a syntaktické analýzy odstraněním nežádoucích tokenů
- Lexikální analyzátor používají webové prohlížeče k formátování a zobrazení webové stránky pomocí analyzovaných dat z JavaScriptu, HTML, CSS
- Největší nevýhodou použití lexikálního analyzátoru je to, že pro generování lexerových tabulek a sestavení tokenů vyžaduje další provozní režii.