Čo je to lexikálna analýza?
LEXICKÁ ANALÝZA je úplne prvou fázou navrhovania kompilátora. Lexer vezme upravený zdrojový kód, ktorý je napísaný vo forme viet. Inými slovami, pomáha vám previesť postupnosť znakov do postupnosti tokenov. Lexikálny analyzátor túto syntax rozdeľuje na sériu tokenov. Odstráni akýkoľvek ďalší priestor alebo komentár napísaný v zdrojovom kóde.
Programy, ktoré vykonávajú lexikálnu analýzu, sa nazývajú lexikálne analyzátory alebo lexery. Lexer obsahuje tokenizer alebo skener. Ak lexikálny analyzátor zistí, že token je neplatný, generuje chybu. Číta prúd znakov zo zdrojového kódu, kontroluje legálne tokeny a na požiadanie odovzdáva údaje syntaktickému analyzátoru.
Príklad
How Pleasant Is The Weather?
Pozri tento príklad; Tu ľahko rozpoznáme, že existuje päť slov Aké príjemné, počasie je. To je pre nás veľmi prirodzené, pretože môžeme rozpoznať oddeľovače, medzery a interpunkčný symbol.
HowPl easantIs Th ewe ather?
Teraz si pozrite tento príklad, môžeme si ho tiež prečítať. Bude to však trvať nejaký čas, pretože oddeľovače sú umiestnené v Divných miestach. Nie je to niečo, čo k vám príde okamžite.
V tomto návode sa naučíte
- Základné terminológie:
- Architektúra Lexical Analyzer: Ako sa rozpoznávajú tokeny
- Úlohy Lexikálneho analyzátora
- Lexikálne chyby
- Obnova po chybe v Lexical Analyzer
- Lexical Analyzer vs. Parser
- Prečo oddeliť Lexical a Parser?
- Výhody lexikálnej analýzy
- Nevýhoda lexikálnej analýzy
Základné terminológie
Čo je lexéma?
Lexéma je postupnosť znakov, ktoré sú zahrnuté do zdrojového programu podľa zodpovedajúceho vzoru tokenu. Nie je to nič iné ako inštancia tokenu.
Čo je to token?
Token je postupnosť znakov, ktorá predstavuje jednotku informácií v zdrojovom programe.
Čo je to vzor?
Vzor je popis, ktorý používa token. V prípade kľúčového slova, ktoré sa používa ako token, je vzorom postupnosť znakov.
Architektúra Lexical Analyzer: Ako sa rozpoznávajú tokeny
Hlavnou úlohou lexikálnej analýzy je čítať vstupné znaky v kóde a vyrábať tokeny.
Lexikálny analyzátor skenuje celý zdrojový kód programu. Identifikuje každý token jeden po druhom. Skenery sú zvyčajne implementované tak, aby produkovali tokeny, iba ak to vyžaduje syntaktický analyzátor. Takto to funguje -
- „Získať ďalší token“ je príkaz, ktorý sa od parseru odošle do lexikálneho analyzátora.
- Po prijatí tohto príkazu lexikálny analyzátor skenuje vstup, kým nenájde ďalší token.
- Vráti token do analyzátora.
Lexical Analyzer pri vytváraní týchto tokenov preskočí medzery a komentáre. Ak sa vyskytne nejaká chyba, potom Lexikálny analyzátor porovná túto chybu so zdrojovým súborom a číslom riadku.
Úlohy Lexikálneho analyzátora
Lexikálny analyzátor vykonáva nasledujúce úlohy:
- Pomáha identifikovať token do tabuľky symbolov
- Odstráni medzery a komentáre zo zdrojového programu
- Súvisí chybové hlásenie so zdrojovým programom
- Pomáha vám rozšíriť makra, ak sa nachádzajú v zdrojovom programe
- Prečítajte si vstupné znaky zo zdrojového programu
Príklad lexikálnej analýzy, tokeny, ne tokeny
Zvážte nasledujúci kód, ktorý sa privádza do Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Príklady vytvorených tokenov
Lexeme | Token |
int | Kľúčové slovo |
maximálne | Identifikátor |
( | Prevádzkovateľ |
int | Kľúčové slovo |
X | Identifikátor |
, | Prevádzkovateľ |
int | Kľúčové slovo |
Y | Identifikátor |
) | Prevádzkovateľ |
{ | Prevádzkovateľ |
Ak | Kľúčové slovo |
Príklady Nontokens
Typ | Príklady |
Komentovať | // Takto sa porovnajú 2 čísla |
Smernica pred spracovaním | #include |
Smernica pred spracovaním | #define NUMS 8,9 |
Makro | NUM |
Biely vesmír | / n / b / t |
Lexikálne chyby
Postupnosť znakov, ktorú nie je možné naskenovať do žiadneho platného tokenu, je lexikálna chyba. Dôležité fakty o lexikálnej chybe:
- Lexikálne chyby nie sú veľmi časté, mal by ich však spravovať skener
- Nesprávny pravopis identifikátorov, operátorov, kľúčových slov sa považuje za lexikálne chyby
- Všeobecne je lexikálna chyba spôsobená výskytom nejakého nelegálneho znaku, väčšinou na začiatku tokenu.
Obnova po chybe v Lexical Analyzer
Tu uvádzame niekoľko najbežnejších techník obnovy po chybe:
- Odstráni jeden znak zo zostávajúceho vstupu
- V panickom režime sú nasledujúce znaky vždy ignorované, kým nedosiahneme správne sformovaný token
- Vložením chýbajúceho znaku do zostávajúceho vstupu
- Nahraďte znak iným znakom
- Transponujte dva sériové znaky
Lexical Analyzer vs. Parser
Lexikálny analyzátor | Analyzátor |
Program skenovania vstupu | Vykonajte syntaktickú analýzu |
Identifikujte tokeny | Vytvorte abstraktné znázornenie kódu |
Vložte žetóny do tabuľky symbolov | Aktualizujte položky tabuľky symbolov |
Generuje lexikálne chyby | Generuje syntaktický strom zdrojového kódu |
Prečo oddeliť Lexical a Parser?
- Jednoduchosť návrhu: Uľahčuje proces lexikálnej analýzy a syntaktickej analýzy elimináciou nežiaducich tokenov
- Zlepšenie efektívnosti prekladača: Pomáha vám zvýšiť efektívnosť prekladača
- Špecializácia: na zlepšenie procesu lexikálnej analýzy možno použiť špecializované techniky
- Prenosnosť: komunikácia s okolitým svetom vyžaduje iba skener
- Vyššia prenosnosť: zvláštnosti špecifické pre vstupné zariadenie obmedzené na lexera
Výhody lexikálnej analýzy
- Metódu lexikálneho analyzátora používajú programy ako kompilátory, ktoré dokážu pomocou analyzovaných údajov z kódu programátora vytvoriť kompilovaný binárny spustiteľný kód
- Používajú ho webové prehliadače na formátovanie a zobrazovanie webovej stránky pomocou analyzovaných údajov z Javscript, HTML, CSS.
- Samostatný lexikálny analyzátor vám pomôže skonštruovať špecializovaný a potenciálne efektívnejší procesor pre danú úlohu
Nevýhoda lexikálnej analýzy
- Musíte stráviť značný čas čítaním zdrojového programu a jeho rozdelením na tokeny
- Niektorým regulárnym výrazom je dosť ťažké porozumieť v porovnaní s pravidlami PEG alebo EBNF
- Je potrebné vyvinúť väčšie úsilie na vývoj a ladenie lexeru a jeho popisov tokenov
- Na vygenerovanie tabuliek lexeru a vytvorenie tokenov je potrebná ďalšia runtime réžia
Zhrnutie
- Lexikálna analýza je úplne prvou fázou navrhovania kompilátora
- Lexéma je postupnosť znakov, ktoré sú zahrnuté do zdrojového programu podľa zodpovedajúceho vzoru tokenu
- Lexikálny analyzátor je implementovaný na skenovanie celého zdrojového kódu programu
- Lexikálny analyzátor pomáha identifikovať token do tabuľky symbolov
- Postupnosť znakov, ktorú nie je možné naskenovať do žiadneho platného tokenu, je lexikálna chyba
- Odstráni jeden znak zo zvyšného vstupu je užitočná metóda obnovenia chyby
- Lexical Analyzer skenuje vstupný program, zatiaľ čo syntaktický analyzátor vykonáva syntaktickú analýzu
- Uľahčuje proces lexikálnej analýzy a syntaktickej analýzy elimináciou nežiaducich tokenov
- Lexikálny analyzátor používajú webové prehliadače na formátovanie a zobrazovanie webových stránok pomocou analyzovaných údajov z Javscript, HTML, CSS
- Najväčšou nevýhodou používania Lexikálneho analyzátora je, že na generovanie tabuliek lexerov a tvorbu tokenov je potrebná ďalšia runtime réžia.